본문 바로가기
컴퓨터 사이언스/C언어

[C언어]포인터 VS 배열에 대하여: 변수 VS 상수

by 메리뉴데이 2020. 8. 10.

포인터와 포인터가 가리키는 변수를 선언해보자.

 

int * ptr;

int var;

ptr = &var;

 

이렇게 프로그램을 실행시키면 포인터는 var를 가리키고 있게 된다.

ptr ㅡ> var

 

 

배열을 선언해보자.

 

int arr[10];

 

이렇게 하면 이 배열의 이름인 arr는 10개의 요소로 구성된 배열의 첫번째 값(0번째 요소)의 주소값을 의미한다.

이는 arr이라는 배열의 이름이 arr 배열의 첫번째 값을 가리키고 있다. 따라서, arr이라는 배열명 일종의 포인터이다.

arr ㅡ> arr[0]

 

위의 ptr은 변수이기 때문에, ptr = &num와 같이 가리키는 값을  변수 var에서 변수 num으로 바꿀 수 있다. 

그러나, arr은 오로지 배열의 처음인 요소만 가리킬 수 있다. 위의 ptr과 같이 arr = sth 과 같이 어떠한 것을 대입하는 연산이 불가능하다.

 

int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

라고 arr배열을 초기화를 했을 때,

*arr = 10;

이라고 한다면, arr 배열은 다음과 같이 되어 있음을 볼 수 있다.

{10, 1, 2, 3, 4, 5, 6, 7, 8, 9}

이렇듯 arr은 배열의 첫 요소에 관하여 포인터 역할을 하고 있는 것이다.

더불어, int형 배열 arr임을 먼저 선언했기 때문에, arr이 int형 값을 가리키고 있다는 정보를 갖고 있기 때문에

*arr(:arr이 가리키고 있는 메모리로의 접근)이 에러없이 작동할 수 있는 것이다.

 

즉, 포인터 ptr은 다른 것을 가리킬 수 있는 변수이지만, 배열의 이름 arr은 오로지 하나(배열의 첫 요소)만 가리킬 수 있는 상수라는 차이가 있다. 그보다 더 중요한 것은, 포인터로 따로 선언하지 않아도 int형 배열로 선언된 arr에서 배열명인 arr이 여기서 int형 포인터라는 사실이다.