프로그래밍 언어 활용
포인터와 포인터 변수
원본 81~82쪽
포인터는 변수의 주소를 말하며, C언어에서는 주소를 제어할 수 있는 기능을 제공한다.
C언어에서 변수의 주소를 저장할 때 사용하는 변수를 포인터 변수라 한다.
포인터 변수를 선언할 때는 자료의 형을 먼저 쓰고 변수명 앞에 간접 연산자 *를 붙인다( int *a;).
포인터 변수에 주소를 저장하기 위해 변수의 주소를 알아낼 때는 변수 앞에 번지 연산자 &를 붙인다( a = &b;).
실행문에서 포인터 변수에 간접 연산자 *를 붙이면 해당 포인터 변수가 가리키는 곳의 값을 말한다( c = *a;).
포인터 변수는 필요에 의해 동적으로 할당되는 메모리 영역인 힙 영역에 접근하는 동적 변수이다.
메모리
주소
| 0 | ||
|---|---|---|
| 4 | 100 | |
| 8 | ||
| 12 | ||
| 50 | 4 |
a
b
예를 들어, a 변수에 100을 저장시키고, a 변수의 주소를 포인터 변수 b에 기억시켰다면 다음 그림과 같이 표현하고 말할 수 있다.
a는 메모리의 4번지에 대한 이름이다.
a 변수의 주소는 4다.
a 변수에는 100이 기억되어 있다.
4번지에는 100이 기억되어 있다.
&a는 a 변수의 주소를 말한다. 즉 &a는 4다.
포인터 변수 b는 a 변수의 주소를 기억하고 있다.
포인터 변수가 가리키는 곳의 값을 말할 때는 *을 붙인다.
*b는 b에 저장된 주소가 가리키는 곳에 저장된 값을 말하므로 100이다.
인하시오.
main( )
{
int a = 50; ❶
정수형 변수 a를 선언하고 50으로 초기화 한다. 정수형 변수가 저장된 곳의 주소를 기억할 포인터 변수 b를 선언한다. 정수형 변수 a의 주소를 포인터 변수 b에 기억시킨다. b에는 a의 주소가 저장된다. b가 가리키는 곳의 값에 20을 더한다. b가 가리키는 곳이 a이므로 결국 a의 값도 바뀌는 것이다.
int *b; ❷
b = &a; ❸
*b = *b+20; ❹
printf(“%d, %d”, a, *b); ❺
70, 70
결과
❷와 같이 선언할 때 *는 해당 변수가 포인터 변수라는 것을 의미한다.
❹, ❺와 같이 사용할 때 *를 붙이면 그 포인터 변수가 가리키는 곳의 값을 의미한다.
}
위 코드의 실행 과정에 따라 메모리의 변화를 그려보면 다음과 같다. ❶, ❷번 수행 : 주기억장치의 빈 공간 어딘가에 a라는 이름을 붙이고 그 곳에 50을 저장함
메모리
주소0000⋮a 1000⋮9999
| 50 |
b
❸번 수행 : 변수 a의 주소가 b에 기억된다는 것은 b가 변수 a의 주소를 가리키고 있다는 의미
메모리
주소0000⋮a 1000⋮9999
| 50 |
| 1000 |
b
❹번 수행 : b가 가리키는 곳의 값에 20을 더해 다시 b가 가리키는 곳에 저장함. 그곳은 변수 a의 주소이므로 변수 a의 값도 저절로 변경되는 것
메모리
주소0000⋮a 1000⋮9999
| 70 |
| 1000 |
b