변수는 값(자료형에 맞는)을 저장하고, 포인터 변수는 주소를 저장하는 변수이다.
포인터 변수는 주소를 저장하기 때문에 상수값을 저장할 수 없고 NULL이나 다른 변수의 주소를 저장해야 한다. 상수값을 저장할 수 없는 이유는 해당하는 상수번지에 어떤 데이터가 있는지 알 수 없고, 해당 데이터를 다른 중요한 프로그램이 사용한다면 수정해서는 안되기 때문이다.
포인터 변수를 선언하는 방법은 다음과 같고 변수의 주소는 &를 통해 알 수 있다.
자료형 *변수명;
자료형 *변수명 = 초기값;
1
2
3
4
|
int *pt1; //포인터 수
int *pt2 = NULL; //포인터 변수 선언 및 NULL로 초기화
int num = 10;
int *pt3 = # //포인터 변수 선언 및 다른 변수의 주소를 저장
|
cs |
4번째 줄에 int *pt3 = &num3;를 그림으로 표현하면 아래와 같이 표현할 수 있다. 주소는 매 실행마다 달라지므로 예로 pt3의 주소를 200번지, num의 주소를 100번지로 나타냈으며 pt3는 num의 주소인 100번지를 저장하고 있다.
포인터 변수는 저장된 주소에 있는 변수의 값을 포인터 연산자(*)를 통해 가져오거나 수정할 수 있다. 다음 코드는 pt3를 통해 num의 값을 가져오고 수정하는 예제 및 출력 결과이다.
1
2
3
4
5
6
7
8
9
10
11
12
|
#include <stdio.h>
int main(void) {
int num = 10;
int *pt3 = #
//포인터 연산자(*)를 통해 num의 값을 가져옴
printf("*pt3 = %d\n", *pt3);
//포인터 연산자(*)를 통해 num의 값을 수정
*pt3 = 20;
printf("num = %d\n", num);
return 0;
}
|
cs |
*pt3 = 10
num = 20