[C] C언어의 포인터 및 메모리 포스팅에서 메모리 관련 연산자는 두 가지가 있다고 언급했습니다.
[ 메모리 관련 연산자 ]
1. & : 주소 연산자
2. * : 포인터 연산자
이번 포스팅에서는 포인터 연산자의 기초 사용법에 대해 알아보겠습니다.
포인터 변수는 말 그대로 변수입니다.
하지만, 주소만을 담을 수 있기 때문에 포인터 변수라고 부릅니다.
[ 포인터 연산자( * )의 사용법_1 ]
포인터 연산자인 * 을 사용하여 포인터 변수를 선언할 수 있습니다.
ex) int * p; // int형의 포인터 변수 p를 선언
하지만, 변수에서의 자료형과는 차이가 있습니다.
위 예시에서의 자료형 int는 포인터 변수 자체의 자료형이 아닙니다. 포인터가 가리키고 있는 변수의 자료형을 뜻합니다.
int a = 10;
으로 먼저 int형의 변수 a를 선언하였습니다. 이를 가리키는 포인터 변수 p를 선언하고 싶다면
포인터 변수가 가리키는 변수 a의 자료형을 따라가야 합니다. 즉,
int * p;
로 포인터 변수를 선언해야 합니다.
(변수 a가 float형으로 선언되었다면 float * p , 변수 a가 char형으로 선언되었다면 char * p ...)
하지만 위의 예시에서는 한가지 오류가 있습니다.
int a 로 변수를 선언했더라도 p는 a를 가리키고 있지 않습니다.
즉, 포인터 변수 p는 가리키는 변수가 없는 상태이므로 말 그대로 선언만 한 상태입니다.
포인터 변수가 특정 변수를 가리키기 위해서는 포인터 변수의 값에 변수의 주소를 넘겨줘야 합니다.
p = &a; // 변수 a의 주소값을 p에 넘겨주는 것.
이제야 포인터 변수 p는 a라는 변수의 메모리 주소를 가집니다. 포인터 변수 p는 a라는 변수를 가리키는 것입니다.
포인터 변수는 가리키는 변수의 주소를 가지고 있습니다.
따라서, 변수의 주소를 통하여 언제든 변수의 값을 "간접적"으로 가져올 수 있습니다.
지역 변수가 함수 밖을 벗어나면 사용이 불가하지만,
포인터를 사용한다면 지역 변수의 값을 아무데서나 가져올 수 있음을 뜻합니다.
[ 포인터 연산자( * )의 사용법_2 ]
포인터 연산자는 선언 뿐 아니라, 다른 방법으로 사용이 가능합니다.
아래 예시에서처럼 포인터 변수가 가지고 있는 주소(가리키는 주소)의 실제 값을 불러오는 것이 가능합니다.
13행에서의 p는 실제 가지고 있는 주소값을 정수형으로 반환하지만,
14행에서의 *p는 가지고 있는 주소에 담겨있는 실제 값(가리키는 주소의 실제 값)을 반환합니다.
[ 포인터 연산자( * )의 사용법_3 ]
아래 예시는 포인터 변수를 사용하여 실제 값을 바꾸는 코드입니다.
// 4행 : char형의 변수 ch 안에 있는 실제 값은 A입니다.
// 5행 : 포인터 변수 p를 선언함과 동시에 ch의 주소를 대입합니다.
// 6행 : 포인터 변수 q를 선언함과 동시에 p가 가지고 있는 주소를 대입합니다.
// 8행 : *q로 q가 가진 주소의 실제 값에 Z를 대입합니다.
위의 방법처럼 포인터 변수를 사용하여 실제 값을 변경하는 것이 가능해집니다.
'[C] C언어 기초' 카테고리의 다른 글
[C] C언어의 포인터 및 메모리_2 (0) | 2022.04.08 |
---|---|
[C] C언어의 포인터 및 메모리 (0) | 2022.04.07 |
[C] C언어 연습문제 (5) | 2022.04.05 |
[C] C언어 기초 함수 (0) | 2022.04.04 |
[C] C언어의 배열(array) (0) | 2022.04.03 |