본문 바로가기

Let's Study/Pointer

5. *p와 p[]의 차이.

*p와 p[]의 차이를 설명하기에 앞서 간단한 코드를 보여드리겠습니다.

 

 

 

 

 

1번은 배열을 이용해서 각각 *(a + 2), a[2], 2[a]를 출력하고 있고

 

2번은 char형 포인터에서 b[2]에 해당하는 값을 출력하는 겁니다.

 

 

각각 어떤 값이 출력될까요?

 

 

 

1번

 

여러분이 아시는 a[2]는 당연히 3이 출력되겠죠.

그렇다면 2[a]와 *(a + 2)는 어떤 값이 출력이 될까요?

 

 

똑같이 3, 3이 출력이 됩니다.

여기서 눈치가 조금 빠르신분은 대충 아셨겠지만 a[2]는 배열이 아닙니다.

포인터 변수를 배열처럼 사용했을 뿐. a[2]의 의미는 a에서 2만큼 더 떨어진 곳의 값을 지칭합니다.

그래서 *(a + 2) == a[2]는 같은 표현이죠.

 

그렇다면 2[a]는 무슨 뜻일까요. C언어에서 []는 연산자를 나타냅니다.

두 개의 피연산자를 가지고 있고 하나는 기본위치를, 다른 하나는 기본위치에서 얼만큼 떨어져있는가를 나타냅니다.

 

그래서,

*(a + 2) == *(2 + a) == a[2] == 2[a] 가 됩니다.

 

 

 

2번

 

1번을 잘 보셨다면 2번의 답은 바로 보입니다.

 

b가 가르키는 곳에서 2만큼 더 떨어진 곳의 값, a가 출력이 됩니다.

 

 

 

 

 

 

 

 

 

 

위의 코드를 얼핏 봤을 때 *a와 a[]는 똑같은 것 같이 보입니다.

하지만, 엄연히 다릅니다.

 

다음 코드를 보자면,

 

 

 

*sha와 s[]를 선언하고 주소값을 출력했습니다.

이것만 보면 헷갈릴지도 모르니 그림으로 보여드리겠습니다.

 

 

 

sha에는 sha가 가르키고 있는 주소값이 들어있고 그 주소값을 따라가보면

shayete가 있습니다.

 

반면에, s[]는 shayete 문자열이 하나씩 s 배열에 할당됩니다.

 

 

그리고

 

char* sha의 "shayete"는 문자열 상수입니다. 변하지 않는 값을 뜻하고 있어서,

*sha = 'J'; 같이 sha에 있는 문자를 바꾸려고 하면 세그멘테이션 오류가 발생합니다.

 

 

char s[]의 "shayete"는 각각 배열에 할당되어 있으므로 값을 바꾸려고 한다면

오류없이 그 배열에 해당되는 값이 바뀌게 되고요.

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

4. sha == sha[0] == &sha[0][0]  (0) 2013.03.23
3. 배열포인터, 이젠 아무대나 *쓰지말자!  (0) 2013.03.22
2. 포인터가 4바이트인 이유  (1) 2013.03.21
1. *의 두가지 의미  (0) 2013.03.21