일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- c# 추상 클래스
- gitlab
- 플러터
- c# winform
- 포인터
- docker
- C# delegate
- 구조체
- github
- C++
- dart 언어
- C언어 포인터
- jupyter
- vim
- c언어
- Data Structure
- jupyter lab
- Unity
- 도커
- Algorithm
- Python
- Flutter
- Houdini
- 유니티
- c# 윈폼
- git
- HTML
- 깃
- c#
- 다트 언어
- Today
- Total
nomad-programmer
[Programming/C] 주소의 형 변환 본문
형 변환은 암묵적인 형 변환과 명시적인 형 변환이 있다. 암묵적인 형 변환은 컴파일러에 의해 자동으로 변환되고 명시적인 형 변환은 () 연산자를 사용하여 변환한다.
char형 변수(1바이트)를 int형 변수(4바이트)에 대입하는 경우 암묵적인 형 변환(자동 형 변환)이 수행된다. 작은 자료형을 큰 자료형으로 변환하는 경우 컴파일러는 자동으로 형 변환을 수행한다.
에를 들어 (char)는 char형으로 자료형을 변환하라는 의미이고 (char*)는 char형 주소로 자료형을 변환하라는 의미이다.
#include <stdio.h>
int main() {
char c = 'A';
printf("%x %x %x\n", &c, (char*)&c, (int*)&c);
printf("%x %x %x\n", &c+1, (char*)&c+1, (int*)&c+1);
printf("%x %x %x\n", &c+2, (char*)&c+2, (int*)&c+2);
printf("%x %x %x\n", &c+3, (char*)&c+3, (int*)&c+3);
return 0;
}
// 결과
/*
73f817 73f817 73f817
73f818 73f818 73f81b
73f819 73f819 73f81f
73f81a 73f81a 73f823
*/
&c에 (char*)와 (int*)를 붙여 각각 주소 형 변환을 하고 있다. 이때 (char*)는 &c가 char형 주소이므로 두 형태는 같다. (&c == (char*)&c)
하지만 (int*)를 붙여 &c를 int형 주소로 명시적 형 변환하고 이곳에 정수를 더하면 주소가 4바이트씩 증가하는 것을 볼 수 있다.
이 결과는 배열이나 포인터를 이해하는데 아주 중요한 역할을 한다.
1차원 배열이든 다차원 배열든 메모리에 저장되는 형태는 똑같다. 이러한 점을 이용하여 다차원 배열을 1차원 배열의 메모리 접근처럼 구성하여 메모리의 값을 취할 수 있다.
#include <stdio.h>
int main() {
int arr[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
int sum = 0;
for (int i = 0; i < sizeof(arr) / sizeof(int); i++) {
sum = sum + *((int*)arr + i);
}
printf("총 합: %d\n", sum);
return 0;
}
// 결과
/*
총 합: 21
*/
2차원 배열인 변수 arr은 포인터 연산 시 12바이트씩 건너뛰는 상수 포인터이다. 허나 "(int*)" 로 형 변환하여 포인터 연산을 진행한다. 따라서 arr은 포인터 연신 시 4바이트씩 건너뛰는 상수 포인터로 접근할 수 있다.
이로 인해 int 자료형 만큼의 메모리 6개를 접근한 후 메모리 공간에 있는 값들을 sum 변수에 더해주고 있다.
3차원 배열로 확장했을때도 마찬가지다 아래의 예제를 보자.
#include <stdio.h>
int main() {
int arr[2][2][3] = {
{
{1, 2, 3},
{4, 5, 6}
},
{
{7, 8, 9},
{10, 11, 12}
}
};
int sum = 0;
for (int i = 0; i < sizeof(arr) / sizeof(int); i++) {
sum = sum + *((int*)arr + i);
}
printf("총 합: %d\n", sum);
return 0;
}
// 결과
/*
총 합: 78
*/
위의 예제로 통해 1차원 배열이나 다차원 배열의 메모리 구조, 메모리 크기가 같다는 것을 확인할 수 있다.
'Programming > C' 카테고리의 다른 글
[Programming/C] 상수 주소를 사용한 배열 요소 접근 (0) | 2020.06.21 |
---|---|
[Programming/C] 주소와 메모리 (0) | 2020.06.21 |
[Programming/C] 개발 도구들 (0) | 2020.06.21 |
[Programming/C] 자동화된 테스트 (0) | 2020.06.21 |
[Programming/C] 자료형 범위의 값 (0) | 2020.06.21 |