본문 바로가기

프로그래밍/C/C++

골치아픈 배열의 이름

#ads_1

arr[3][2] 가 있을 경우

1. arr
2. &arr[0]
3. &arr

의 결과값은 모두 같다.

어이없다.  -_-;

이해가 안된다. ㅜㅜ

알고 보니 다음과 같다고 한다. ^^


arr 는 연산식에 쓰일경우 컴파일러에 의해 &arr[0] 으로 자동변경된다고 한다.

그래서 결론적으로 arr와 &arr[0] 은 연산시에는 완전히 같다고 볼 수 있다.

단, 아래 3가지의 예외가 있긴 있다.

1. sizeof() 의 피연산자일때 =>sizeof(arr)

2. & 의 피연산자일때 => &a

3. 문자열배열을 초기화할때 (?) 암튼...

하지만,

arr 와 &arr는 완전 다른다.

arr 는 첫번째요소의 주소를 가리키는 것이고

&arr 는 arr배열 전체의 주소를 가리키는 것이다.

그래서 arr+1 과 &arr+1 은 결과가 완전다르다.

arr+1 은 배열의 두번째 요소인 arr[1] 의 주소를 반환하지만

&arr+1 은 배열전체의 크기만큼 건너뛰기 때문에 arr배열이 확보한 영역 바로 뒤의 주소가 반환된다.

아래 예제로 확인해 볼 수 있다.


#include <stdio.h>


int main( int c, char *v[] )
{
    int arr[3][2] = {
        {1,2},
        {3,4},
        {5,6}
    };

    printf("전체크기 : %d\n", sizeof(arr));
    printf("마지막 요소의 주소 : %x\n", &arr[2][1]);

    printf("-----------------------\n");

    printf("arr : %x\n", arr);
    printf("&arr[0] : %x\n", &arr[0]);
    printf("&arr : %x\n", &arr);

    printf("-----------------------\n");
    printf("1을 더한뒤의 주소값\n");
    printf("-----------------------\n");

    printf("arr + 1 : %x\n", arr + 1);
    printf("&arr[0] + 1 : %x\n", &arr[0] + 1);
    printf("&arr + 1: %x\n", &arr + 1);

    getchar();


    return 0;
}


<< 결과 >>

전체크기 : 24
마지막 요소의 주소 : 19f9b4
-----------------------
arr: 19f9a0
&arr[0] : 19f9a0
&arr : 19f9a0
-----------------------
1을 더한뒤의 주소값
-----------------------
arr + 1: 19f9a8   =>  첫번째 요소의 주소( 19f9a0 ) + (sizeof(int) * 2)
&arr[0] + 1 : 19f9a8 => 첫번째 요소의 주소( 19f9a0 ) + (sizeof(int) * 2)
&arr + 1 : 19f9b8 => 마지막요소(arr[2][1])의 주소 19f9b4 + sizeof(int)


#ads_1