배열의 이름에 대해

보물창고·2023년 1월 26일
0
  • 업데이트 240319

잘못된 개념

: 배열의 이름은 배열의 주소로 알아왔지만,
정확히 말하자면, 배열의 주소가 아니다.

알아야 할 지식

: 선언문에서 변수의 이름을 빼면, 해당 변수의 타입이 결정됨.

  • 예시
    int n; 변수 이름은 : n , 타입은 : int
    double d ; 변수 이름은 : d, 타입은 : double
    int arr[3]; 변수 이름은 : arr, 타입은 : int[3]

-> 배열 arr을 보면, 타입이 포인터가 아니고, int[3] 이라는 것을 확인할 수 있다.

포인터를 만드는 것은 우변의 타입과 동일한 타입으로 맞춰주고
(+)추가적으로 * 표시를 붙이는 것임,

  • 포인터로 참조 하는 규칙!(위의 설명을 토대로)
    : int arr[3] 은 어떻게 포인터를 작성할 수 있을까?

  • 이렇게 일까??? -> 보지도 못함...
    int[3] *p = &arr;

  • 39번 줄처럼 사용한다.
    : [] 연산자가 * 보다 연산자 우선순위보다 높기 때문에 애스터리스크가 있는 부분을 괄호로 묶어서 우선순위를 높여야 한다.

  • -> 그렇다면, "배열의 이름은 배열의 포인터다! " 라는 개념은 뭐가 잘못된 것일까?

배열의 이름의 정체

외워라!

  • 배열의 이름은 첫번째 원소의 주소로 암시적 형변환 된 것임.

int arr[3]{1,2,3};
int * p = arr; // 배열의 첫번째 요소를 나타냄.
int
*p2 = &arr; // 전체 배열[3] 의 주소를 의미하고

  • problem

  • 위의 내용을 확인하는 방법은 .
    +1을 증가해 주소값이 어떻게 출력되는지를 확인하자.
    : 알아둬야 할 부분 : c++은 포인터 변수에 ++/ -- 연산자를 사용하면
    자신의 타입 크기만큼 주소값이 변경되는 특징이 있다.

    • 결과
      : 배열의 요소로 넣을 1번째는 +4가 증가했고,
      배열의 이름 주소를 넣은 것은 +12가 증가한것을 확인할 수 있음.
      - p2는 배열 3개이므로 12개의 크기를 가지고 있고, 즉 p2 + 1 은
      12바이트씩 증가하는 것이다.
      -> 즉 배열의 주소는 배열 전체의 주소를 의미함.
      -> 배열의 이름은 [0] 번째 배열이 암시적 형변환 된것임.
profile
🔥🔥🔥

0개의 댓글