본문 바로가기

Let's Study/Pointer

3. 배열포인터, 이젠 아무대나 *쓰지말자!

 *의 두가지 의미를 설명했을 때, 제일 중요했던 건

1. 초기값을 지정해줄 때의 *는 번지를 가르키는 걸 뜻했고

2. 수식에서의 *는 포인터변수가 가르키는 주소의 값을 리턴한다고 했습니다.

 

이 두가지는 포인터를 하시면서 반드시 기억해주세요.

 

 

 

오늘은 배열포인터에 대해 글을 쓸게요.

 

우선, 배열이 뭘까요. 여러분도 다 아시듯

array[3] = {1, 2, 3} 이런식으로 변수 여러개를 편리하게 지정할 수 있죠.

 

그렇다면 배열의 포인터는?

배열 포인터변수에 배열의 주소값을 넣게 될 경우, 배열의 첫번째 번지를 가르키게 됩니다.

array[3]이라면 array[0]을 가르킬 것이고 array[2][3]이라면 array[0][0]을 가르키겠죠?

 

 

이런식으로 표현할 수 있겠습니다.

(주소크기가 1씩 증가하는건 그냥 넘어가주세요. 예를 들어서 표현한거라 신경을 못썼습니다. 죄송합니다 (_ _))

 

 

기본적인건 다 아시리라 믿고 중요한 것만 적어보겠습니다.

 

 

 

예를 들어 이런 문제가 있습니다.

 

1~8번까지 어떤 값이 출력될까요?

 

 

 

 

 

 

 

 

 

 

1번

이건 쉽죠? 포인터변수 psha에 sha 배열의 첫번째 주소에서 1만큼 떨어진 곳(sha[1])의 주소를 넣습니다.

그리고 printf로 출력.

그렇게 되면 1번은 24를 출력하게 됩니다.

 

 

2번

 

포인터변수 psha에 sha 배열의 첫번째 주소에서 3만큼 떨어진 곳의 주소를 넣습니다.

그러나 sha배열은 3개이기 때문에 sha+3인 곳엔 쓰레기 값이 들어있습니다.

결과, 출력해보면 이상한 값이 나오구요.

 

 

3번 ~ 6번은

 

1, 2번을 이해하셨다면 정말 쉽습니다.

3번은 psha가 가르키는 주소의 값. 23

4번, 23, 24, 25

5번과 6번은 3,4번과 비슷하죠?

 

문제는 7, 8번입니다.

 

 

7번

 

어떻게 출력될까요? 이게 맞는 문장일까요?

 

 

확인해보면 정상적으로 출력됩니다. 23, 24, 25.

맞는 문장이네요.

 

 

8번

 

그럼 이건 어떻게 될까요.

 

에러가 출력될겁니다. 겉보기엔 맞는문장같지만 저 문장은 아주 제대로 틀렸죠.

 

다시 확인해봅니다.

*sha++, 여기서 연산자 우선순위를 보면 후위증가연산자 ++이 *보다 순위가 높습니다. 따라서

*sha++ = *(sha++) 이렇게도 되는거죠.

배열 sha의 번지를 증가시켜서 그 안의 값을 출력시켜라? 말이 안됩니다.

sha는 배열명으로써 sha[0]이 저장된 곳의 주소를 가르키고 있을 뿐 메모리할당은 받지 않았습니다.

배열명 자체에 주소값 할당같은건 이루어질 수 없다는거죠.

 

이게 무슨 멍멍멍 같은 소리냐구요?

그림으로 보여드리겠습니다.

 

 

sha는 배열명일 뿐 어디에도 속하지 않은걸 볼 수 있습니다. 메모리할당을 받지 않았죠.

그래서 '말같지도 않은 말 붙여넣지 말아라'라고 에러가 뜨는겁니다.

 

만약 8번이 (*sha)++라면 어떻게 될까요?

결과가 쉽게 머릿속에 그려지죠? 

 

 

'Let's Study > Pointer' 카테고리의 다른 글

5. *p와 p[]의 차이.  (2) 2013.05.07
4. sha == sha[0] == &sha[0][0]  (0) 2013.03.23
2. 포인터가 4바이트인 이유  (1) 2013.03.21
1. *의 두가지 의미  (0) 2013.03.21