본문 바로가기
  • 부자가 될 남자
프로그래밍/C

[C언어] 배열은 주소값이다.

by ㅍ우주 2023. 5. 18.

d배열이 주소값이라니 이게 무슨 허무맹랑한 소리인가 싶을 수 있다.

물론, 배열 안에는 값들이 들어있는 것이 맞다. 

그러나, 우리가 정의한 배열의 이름. 그 이름에는 주소값 지정되어있다.

이해가 되지 않아도 좋다. 아래의 설명을 보도록 하자.

 

우리가 int a[5] = {1,2,3,4,5}; 라고 배열 a를 정의 및 초기화 했다고 해보자.

이때, 배열 a를 하나의 방 관점으로 본다면, 배열 a의 각각의 인덱스(a[0], a[1], ... 과 같은 것)들은

배열 a 안의 또다른 방이라고 생각할 수 있다. 

그러니까, 내가 말하고 싶은 바는 무엇이냐면 배열 a라는 것에도 주소가 있고, 그 배열 안의 인덱스들에도 따로 주소가 존재한다는 것이다.

그렇기에 배열의 이름은 주소값이다.

 

한가지 코드를 보며 이해해보도록 하자. 

 

#include <stdio.h>

int main(void) {
    int arr[3] = {10,20,30};
    printf("%p\n", arr);
    for (int i=0; i<3; i++ )
        printf("%p\n", arr[i]);
}

자, 보이는가. 배열은 주소이며, 배열의 인덱스 또한 또다른 주소를 가지고 있음을 파악할 수 있다.

 


따라서 포인터 변수 = 배열을 사용할 때에는, 배열 앞에 &를 붙이지 않는다. 배열은 그 자체로서 주소값이기에.

 

 

#include <stdio.h>
 
int arrChg(int *ptr) {
    ptr[2] = 50;
}

int main(void) {
    int arr[3] = {10,20,30};
    arrChg(arr);
    for (int i =0; i<3; i++)
        printf("arr의 %d번째 수 : %d\n", i, arr[i]);
}

 

위의 코드를 이해해보자. 내가 여기서 중점적으로 말하고 싶은 것은 int *ptr에 arr을 넣었다는 것. &arr이 아니라는 것. 이것이 내가 짚고 싶었던 바이다.