본문 바로가기

Architecture for Software/C and C++

Pointer 의 선언

Pointer의 선언은 다음과 같은 방식을 통하여 이루어 진다.

int  *a;


*a는 정수 타입이라는 결과를 나타낸다. * 연산자가 '간접지정 연산자'라는 것을 알고 있다면 a가 정수를 가리키는 포인터라는 것도 알 수 있을 것이다.

간접지정 연산자는 포인터 값에서만 유효하다. 포인터는 결과를 가리키고, 간접지정 연산자는 결과를 얻는 포인터를 '따라'간다.

C언어의 형식이 자유롭기 때문에 다음과 같이 타입 바로 뒤에 *를 사용할 수 있다.

int* a;


이런 형식의 선언은 위에서 보았던 선언과 동일한 의미이면서도 a가 int 타입이라는 것을 더욱 더 분명하게 나타내준다. 그러나 이런 스타일의 선언은 좋지 않다. 다음 예를 보면 그 이유를 더욱 분명하게 알 수 있다.

int* b, c, d;


보통 이러한 선언을 보았을 때 b, c, d 모두 정수 포인터 변수라고 이해하지만, 실제로는 그렇지 않다. 그렇게 보이기 때문에 착각을 하는 경우인데, *b의 한부분이 포인터로 선언된 것이며, 나머지 c, d는 일반 정수 변수이다.

따라서 b, c, d 모두를 포인터 변수로 선언하려면 다음과 같이 선언하는 것이 정확하다.

int *b, *c, *d;

포인터 벼수 선언에서 변수의 초기값을 지정할 수 있다. 다음은 포인터를 선언하고 문자열 리터럴로 초기화하는 예를 보여준다.

char *message = "Hello World!";

이 문장은 message를 문자 포인터로 선언하고 문자열 리터럴의 첫 문장의 주소로 초기화했다. 하지만 이런식의 초기화는 한가지 위험요소를 가지고 있는데 의미를 잘못 해석할 수 있다는 것이다. 위의 선언은 다음과 같다.

char *message;
message = "Hello World!";