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

조회수 8410회

발생하는 문제 및 실행환경

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

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

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

소스코드

#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 답변

  • 좋아요

    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
    

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)