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* pp 는 int 주소를 담는 변수 (선언)
*pp 가 가리키는 곳의 실제 값 (사용)
p주소 그 자체 (번지수)
&nn 의 주소를 가져옴

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* pp 는 int 주소를 담는 변수
사용*pp 주소로 가서 값 꺼냄
함수 반환int* func()함수가 int 주소를 반환
함수 포인터int* (*fn)()fn 은 함수 주소를 담는 변수
공통 원칙: * = 항상 "주소" 와 관련된 것 선언이냐 사용이냐에 따라 역할이 달라질 뿐

10. 핵심 한 줄 요약

int* p = int 값이 저장된 메모리 공간의 주소를 담는 변수 p 안에 있는 건 값이 아니라 위치 *p 로 그 위치에 찾아가야 값이 나옴
Go toor?