포인터 연산자
포인터를 지원하기 위한 연산자는 변수의 주소를 구성하는 &(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 |