배열 이름이랑 배열의 주소가 같은건 왜죠?
조회수 8412회
발생하는 문제 및 실행환경
배열 이름이랑 배열 주소가 같길래 포인터가 배열을 가리키게 해놓고 포인터 주소를 출력했더니 다르게 나왔어요.
배열이름 = 배열 주소 이면서
포인터값 != 포인터 주소 인건 왜일까요?
소스코드
#include <stdio.h>
int main()
{
char my_array[100] = "some cool string";
printf("my_array = %p\n", my_array);
printf("&my_array = %p\n", &my_array);
char *pointer_to_array = my_array;
printf("pointer_to_array = %p\n", pointer_to_array);
printf("&pointer_to_array = %p\n", &pointer_to_array);
printf("Press ENTER to continue...\n");
getchar();
return 0;
}
출력
my_array = 0022FF00
&my_array = 0022FF00
pointer_to_array = 0022FF00
&pointer_to_array = 0022FEFC
-
(•́ ✖ •̀)
알 수 없는 사용자 - 〉
1 답변
-
배열 이름과 배열 주소의 관계
보통 배열의 이름은 배열의 첫 번째 원소의 주소와 같습니다. 그래서 배열의 주소와 배열 이름이 같은 것이지요.
그렇다고 해서 배열 주소와 배열 이름의 타입이 같은 건 아니기 때문에 둘의 연산 결과가 같은 건 아닙니다.
배열의 이름이
sizeof
나&
(단항 연산자)의 피연산자가 될 때 배열 이름은 객체 그 자신이 됩니다. 예를 들면sizeof(배열 이름) = 배열
의 전체 크기인 것 처럼.그런데 배열의 주소가 피연산자가 되는 경우, 이 때는 타입이 됩니다. 예를 들면
T array[size]
면sizeof(배열 주소) = T*
의 크기입니다.int main(void) { int myarr[10] = {1,2,3,4,5,6,7,8,9,10}; //둘이 같음 printf("배열의 주소 :\t%p\n", &myarr); //배열의 주소 printf("배열의 이름 :\t%p\n\n", myarr); //배열의 이름 //둘이 다름 printf("배열주소+1 :\t%p\n", &myarr+1); //배열주소+1 printf("배열이름+1 :\t%p\n\n", myarr+1); //배열이름+1 //당연히 다름 printf("**(배열주소+1) :\t%d\n", **(&myarr+1)); //**(배열주소+1) - undefined behavior printf("*(배열이름+1) :\t%d\n\n", *(myarr+1)); //*(배열이름+1) - 2번째 값이 나옴 //크기비교 printf("배열주소 크기 :\t%lu\n", sizeof(&myarr)); printf("int*의 크기 :\t%lu\n\n", sizeof(int*)); printf("배열이름 크기 :\t%lu\n", sizeof(myarr)); printf("int의 크기 x 원소갯수10 : %lu\n", sizeof(int)*10); }
출력 :
배열의 주소 : 0x7fff5fbff740 배열의 이름 : 0x7fff5fbff740 배열주소+1 : 0x7fff5fbff768 배열이름+1 : 0x7fff5fbff744 **(배열주소+1) : 1389390144 *(배열이름+1) : 2 배열주소 크기 : 8 int*의 크기 : 8 배열이름 크기 : 40 int의 크기 x 원소갯수10 : 40
댓글 입력