#포인터의 선언과 초기화
포인터(pointer)는 프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간 주소를 가리키는 변수를 말한다.
어렵게 생각할 필요없이, 포인터 또한 우리가 지금까지 써왔던 int, double과 같이 하나의 변수이다.
int형은 정수를 저장하고, double형이 실수를 저장하듯이 포인터 변수는 메모리의 "주소"를 저장한다.(포인터 변수를 줄여서 포인터라고 한다)
다음 코드를 보면 포인터의 개념이 잡힐 것이다.
#include <stdio.h>
int main()
{
int num1 = 10;
int* p; // 포인터 변수 p의 선언
p = &num1; // 포인터 변수 p의 초기화
// int* p = &num1; 와 같이 선언과 동시에 초기화 할 수 있다.
printf("num1의 주소값 : %p\n", &num1); // 0x00BC32
printf("포인터 변수 p가 저장하는 주소값 : %p\n", p); // 0x00BC32
printf("포인터 변수 p가 가리키는 값 : %d\n", *p); // 10
return 0;
}
#포인터와 관련있는 연산자 & and *
위 코드에서 & 연산자와 * 연산자가 보일 것이다. 일반적으로 이들을 가리켜 포인터 연산자라고 하는데, 여기서 말하는 * 연산자는 곱셈의 의미가 아니다. 곱셈 연산자는 피연산자가 두 개인 이항 연산자 임인 반면, * 포인터 연산자는 피연산자가 한 개인 단항 연산자이다. 혼동하지 않도록 주의하자.
- & 연산자는 어떤 변수의 주소 값을 반환하는 연산자이다. Scanf 함수에서 자주 썼듯이 그 뜻이 직관적으로 쉽게 와닿을 것이다.
- * 연산자는 포인터가 가리키는 메모리를 참조(접근)하는 연산자이다. * 연산자는 그 뜻이 직관적으로 안 와닿을 수 있다. 다음 코드의 주석을 유심히 살펴보자.
#include <stdio.h>
int main()
{
int num1 = 10;
int* p = &num1; // 포인터 변수 p가 변수 num1의 메모리 주소 값을 저장한다
*p = 20; // 포인터 변수 p가 가리키는 메모리 공간인 변수 num에 접근하여 변수에 20을 저장하라!
printf("%d", *p); // 20
return 0;
}
이렇듯 사실 *p는 포인터 변수 p가 가리키는 변수 num1을 의미하는 것과 완전히 동일하다.
어느정도 감이오는 가? 이후에 배열과 다중 포인터를 공부하면서 그 의미가 더 명확하게 다가올 것이다.
다음 글에서 매우 중요한 포인터와 배열의 관계에 대해서 공부해보자.
'C' 카테고리의 다른 글
[C] 포인터와 배열과의 관계, 그리고 포인터 연산 (0) | 2022.05.18 |
---|