배열 이름이랑 배열의 주소가 같은건 왜죠?


발생하는 문제 및 실행환경

배열 이름이랑 배열 주소가 같길래 포인터가 배열을 가리키게 해놓고 포인터 주소를 출력했더니 다르게 나왔어요.

배열이름 = 배열 주소 이면서

포인터값 != 포인터 주소 인건 왜일까요?

소스코드

#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
  • 2016년 02월 04일에 작성됨

조회수 341


1 답변


좋아요
0
싫어요
채택취소하기

배열 이름과 배열 주소의 관계

보통 배열의 이름은 배열의 첫 번째 원소의 주소와 같습니다. 그래서 배열의 주소와 배열 이름이 같은 것이지요.

그렇다고 해서 배열 주소와 배열 이름의 타입이 같은 건 아니기 때문에 둘의 연산 결과가 같은 건 아닙니다.

배열의 이름이 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
  • 2016년 02월 04일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close