Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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 31
Archives
Today
Total
05-16 04:51
관리 메뉴

nomad-programmer

[Programming/C] 주소의 형 변환 본문

Programming/C

[Programming/C] 주소의 형 변환

scii 2020. 6. 21. 16:18

형 변환은 암묵적인 형 변환과 명시적인 형 변환이 있다. 암묵적인 형 변환은 컴파일러에 의해 자동으로 변환되고 명시적인 형 변환은 () 연산자를 사용하여 변환한다.

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차원 배열이나 다차원 배열의 메모리 구조, 메모리 크기가 같다는 것을 확인할 수 있다.
Comments