본문 바로가기

Programming/C, C++

포인터 연산자

포인터 연산자

 

포인터를 지원하기 위한 연산자는 변수의 주소를 구성하는 &(address of) 연산자,

 

가리키는 주소의 내용을 참조하는 *(dereference) 연산자, 그리고 현재의 주소에 가리키는 데이터형을 참조하여

 

주소를 옮겨주는 +, - 연산자, 그리고 구조체의 포인터와 작용해서 구조체의 포인터 멤버들을 지정하게 하는 -> 연산자가 있다.

 

 우선 변수의 주소를 구하는 & 연산자는 사용이 간단하다. & 연산자 뒤에 변수명을 써주면 그 변수의 주소를 리턴한다.

 

int *itpr;     //정수형을 가리키는 포인터

iptr = &i;    

 

포인터가 가리키는 주소의 내용을 참조하는 * 연산자는 포인터의 정의에서도 쓰이기 때문에 혼돈이 없어야 한다.

 

* 연산자 뒤에는 반드시 포인터가 와야하며 결과로는 포인터가 가리키는 주소의 내용을 리턴한다.

 

j = *iptr;     //itpr이 가리키는 주소의 내용을 j에 대입, 즉 j = i의 효과

 

앞의 과정을 그림으로 나타내보면 다음과 같다.

 

앞의 그림은 편의상 정수형이나 포인터가 한 바이트 밖에 차지하지 않는 것처럼 그렸다.

 

개념적으로는 무리가 없지만 실제적으로는 포인터는 보통 4바이트를 차지하며, 정수형도 4바이트를 차지한다.

 

 포인터의 구성 요소 중 두번째 가리키는 데이터형이 분명해야 한다. 그 이유는 + 와 -연산을 하기 위해서이다.

 

+와 - 연산은 '포인터 + 정수', '포인터 - 정수','포인터 - 포인터' 등 이 세 가지 형식만 쓰인다.

 

 예를 들어 앞의 iptr을 생각해보자, iptr이 그 내용으로서 0x1000이라는 주소를 가졌다고 하자. 그렇다면 iptr + 1은 과연 어떤 주소일까?

 

그것은 iptr이 가리키는 데이터형에 달려있다. iptr은 정수형을 가리킨다. 정수형은 크기가

 

sizeof(int) = 4 로서 한 정수형이 4바이트를 차지한다.

 

 iptr + 1은 iptr에서 한 개의 요소 뒤의 주소를 가리킨다. 즉, iptr이 마치 정수형 배열의 선두인 것처럼 생각해서

 

iptr[1]의 요소를 가리키는 것이라고 생각하면 된다. iptr +1은 주소로 나타내면 0x1000 + 1*sizeof(int)로서

 

0x1001이 아니라 0x1004가 된다. 마찬가지로 iptr + 2도 0x1008이 된다.

 

 - 연산도 마찬가지이다. iptr -1 은 0x1000 - 1*sizeof(int)의 주소를 가진다.

 

 하지만 '포인터 - 포인터' 형식은 앞의 두 형식과 약간은 의미가 다르다. 포인터에 포인터를 빼는 것은 두 주소간의 차이를 의미한다.

'Programming > C, C++' 카테고리의 다른 글

배열  (0) 2017.12.11
데이터형에 관계없는 swap() 함수  (0) 2017.12.11
void포인터, 함수 포인터  (0) 2017.12.11
포인터의 포인터  (0) 2017.12.11
최적화에 대하여...  (0) 2017.12.11