#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