**포인터(Pointer)**는 일반적인 값(숫자, 문자)이 아니라, 다른 변수가 위치한 "메모리의 주소(Memory Address)"를 값으로 저장하는 변수입니다.
1. 포인터 관련 핵심 연산자 2가지
- 주소 연산자 (
&): 변수 이름 앞에 붙여 해당 변수의 메모리 시작 주소를 알아냅니다. - 역참조(간접 참조) 연산자 (
*): 포인터 변수 앞에 붙여 그 주소가 가리키는 곳에 직접 찾아가 실제 값을 읽거나 수정합니다.
2. 포인터 선언과 동작 예시
#include <stdio.h>
int main(void) {
int num = 10;
int *p = # // p는 num의 메모리 주소를 가리키는 포인터 변수
printf("num의 값: %d\n", num); // 10
printf("num의 주소: %p\n", &num); // 메모리 주소 (예: 0x7ffd...)
printf("p가 가진 주소: %p\n", p); // &num과 동일한 주소
printf("p가 가리키는 값: %d\n", *p); // 10 (역참조)
*p = 50; // p가 가리키는 공간(num)의 값을 50으로 직접 변경!
printf("수정 후 num: %d\n", num); // 50으로 변경됨
return 0;
}
3. Call by Value vs Call by Reference (값 전달 vs 주소 전달)
함수에 변수 값을 그냥 넘겨주면 복사본이 전달되지만, 포인터(주소)를 넘겨주면 함수 안에서 원본 변수의 값을 직접 바꿀 수 있습니다.
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
4. 자주 묻는 질문 (Q&A)
Q. 포인터 변수의 크기는 무조건 4바이트인가요 8바이트인가요?
A. 포인터 변수의 크기는 가리키는 자료형(int*, char* 등)과 상관없이 운영체제 시스템 비트수에 따라 결정됩니다. 32-bit 시스템에서는 4 Bytes, 64-bit 시스템에서는 8 Bytes가 됩니다.