C pointer
C 포인터
May 30, 2026
C 포인터 * 정리
1. * 의 역할은 딱 2가지
1. 선언할 때 → "나는 주소를 저장하는 변수야" 2. 사용할 때 → "이 주소로 찾아가서 값을 꺼내줘"
2. 메모리 기본 개념
int n = 99;
메모리 어딘가에 공간 생성 ┌──────┐ │ 99 │ ← int 값 └──────┘ 주소: 0x100
모든 값은 메모리 어딘가에 저장되고 그 위치를 주소(번지수) 라고 함
3. 선언할 때 * (타입 뒤에 붙음)
int* p = &n;
int* = "int 값이 저장된 메모리 공간의 주소" 를 담는 변수 p → 0x100 (n 이 있는 주소) n → 99 (int 값 자체) p 안에 있는 건 값이 아니라 위치
타입별 비교
int* → int 값이 있는 메모리 주소를 저장 char* → char 값이 있는 메모리 주소를 저장 struct node* → struct node 가 있는 메모리 주소를 저장 공통 원칙: 타입* = "그 타입의 값이 있는 메모리 주소" 를 담는 변수
4. 사용할 때 * (변수 앞에 붙음)
int n = 99; int* p = &n; // p 에 n 의 주소 저장 p → 0x100 (주소) *p → 99 (주소로 가서 꺼낸 실제 값)
선언 이후에 * 가 앞에 붙으면 "이 주소로 찾아가서 값을 꺼내줘" p = 지도의 위치 표시 *p = 그 위치에 실제로 찾아간 것
5. 선언 vs 사용 나란히 비교
int* p; // 선언: p 는 주소를 담는 변수 *p // 사용: p 주소로 가서 값 꺼냄
| 표현 | 의미 |
|---|---|
int* p | p 는 int 주소를 담는 변수 (선언) |
*p | p 가 가리키는 곳의 실제 값 (사용) |
p | 주소 그 자체 (번지수) |
&n | n 의 주소를 가져옴 |
6. 함수 반환 타입에 붙는 *
int dummy() { return 99; } // int 값 자체를 반환 int* dummy() { return &n; } // int 주소를 반환
반환 타입에 * 가 붙으면 "이 함수는 값이 아닌 주소를 반환해"
코드 예시
int* dummy(int* d) { return d + 1; // 주소를 한 칸 이동해서 반환 }
d → [99] [88] ↑ 여기 주소 d + 1 → [99] [88] ↑ 한 칸 이동한 주소 반환
7. 함수 포인터에 붙는 *
int* (*fn)(int*);
(*fn) → fn 은 함수 주소를 담는 변수 int* ... → 그 함수는 int* 를 반환 ... (int*) → 그 함수는 int* 를 인자로 받음
괄호 유무에 따른 차이
() 의 우선순위가 * 보다 높음 수학의 괄호와 같은 원리 int* fn(int*) → () 가 먼저 해석 → fn 은 함수 int* (*fn)(int*) → 괄호로 * 를 강제 → fn 은 함수 주소를 담는 변수
| 표현 | 의미 |
|---|---|
int* fn(int*) | fn 은 함수 (int* 반환) |
int* (*fn)(int*) | fn 은 함수 주소를 담는 변수 |
8. 공백 위치는 상관없음
int* p == int *p == int*p // 모두 같은 의미
관습적으로: int* p → 타입 강조할 때 int *p → 포인터 강조할 때 둘 다 맞음, C 컴파일러는 구분 안 함
9. 전체 한눈에 보기
| 위치 | 표현 | 의미 |
|---|---|---|
| 선언 | int* p | p 는 int 주소를 담는 변수 |
| 사용 | *p | p 주소로 가서 값 꺼냄 |
| 함수 반환 | int* func() | 함수가 int 주소를 반환 |
| 함수 포인터 | int* (*fn)() | fn 은 함수 주소를 담는 변수 |
공통 원칙: * = 항상 "주소" 와 관련된 것 선언이냐 사용이냐에 따라 역할이 달라질 뿐
10. 핵심 한 줄 요약
int* p = int 값이 저장된 메모리 공간의 주소를 담는 변수 p 안에 있는 건 값이 아니라 위치 *p 로 그 위치에 찾아가야 값이 나옴
Go toor?