2What — 포인터란 무엇인가
3- 포인터(pointer)는 메모리 주소를 저장하는 변수다
4- 일반 변수가 "값"을 담는다면, 포인터는 "그 값이 어디에 있는지"를 담는다
5- C에서 포인터는 *로 선언하고, &로 주소를 얻는다
2int *p = &x; // p는 x의 메모리 주소를 저장
7---
8Why — 포인터 없이는 불가능한 4가지
91. 동적 메모리 관리
10 - 프로그램 실행 중에 필요한 만큼 메모리를 할당/해제하려면 포인터가 필수
11 - malloc()이 반환하는 것은 할당된 메모리의 주소(= 포인터)다
12 - 배열 크기를 컴파일 시점에 모를 때, 포인터 없이는 해결 불가
132. 함수 간 데이터 공유
14 - C는 기본적으로 "값에 의한 전달(call by value)"만 지원한다
15 - 함수가 외부 변수를 수정하려면 주소를 전달해야 한다 — 즉, 포인터가 필요하다
16 - 큰 구조체를 복사 없이 전달할 때도 포인터로 주소만 넘긴다 (Kernighan & Ritchie, 1988)
173. 배열과 문자열 처리
18 - C에서 배열 이름은 사실상 첫 번째 원소의 포인터다
19 - 문자열(char 배열)을 다루는 strlen, strcpy 등 표준 함수는 모두 포인터 기반
20 - 배열 순회: arr[i]는 내부적으로 *(arr + i)로 변환된다
214. 시스템 프로그래밍
22 - 하드웨어 레지스터에 직접 접근 → 특정 메모리 주소를 포인터로 지정
23 - 함수 포인터로 콜백(callback) 패턴 구현 → 이벤트 기반 시스템의 기초
24 - 자료구조(연결 리스트, 트리, 그래프)는 포인터 없이 구현 자체가 불가능
25---
26실제 사용 사례 — 포인터가 없으면 세상이 멈춘다
27- 리눅스 커널: 전체 코드의 약 30%가 포인터 연산. 디바이스 드라이버, 메모리 관리자, 파일시스템 모두 포인터 기반 (Torvalds, 1991)
28- 임베디드 시스템: 센서 데이터를 읽을 때 메모리 매핑된 I/O 주소에 포인터로 직접 접근
29- 고성능 서버(nginx, Redis): 메모리 풀을 직접 관리하여 malloc/free 오버헤드를 줄임 — 모두 포인터 조작
30- 게임 엔진: 수백만 개 오브젝트를 포인터 배열로 관리, 매 프레임 16ms 안에 처리
31---
32"나는 Python/Java만 쓰는데?" — 숨겨진 포인터
33- Python의 모든 변수는 사실 PyObject에 대한 포인터다 (CPython 구현)
34- Java의 참조(reference)는 이름만 다를 뿐 포인터의 안전한 래퍼다
35- 이 언어들이 포인터를 숨긴 이유: 직접 다루면 위험하니까 → 하지만 원리를 모르면 성능 문제를 디버깅할 수 없다
36- GC(가비지 컬렉터)가 느려지는 이유, 깊은 복사 vs 얕은 복사의 차이 — 모두 포인터 개념이 기반
37---
38How — 포인터를 이해하는 핵심 멘탈 모델
39- 메모리를 우편함 배열로 상상하라
40 - 각 우편함에는 고유 번호(주소)가 있다
41 - 포인터 = "3번 우편함을 보세요"라고 적힌 쪽지
42 - 역참조(*p) = 쪽지에 적힌 번호의 우편함을 열어보는 행위
43- 포인터의 3가지 핵심 연산
44 - 선언: int *p; → "정수가 든 우편함 번호를 저장할 변수"
45 - 주소 얻기: p = \&x; → "x의 우편함 번호를 p에 기록"
46 - 역참조: *p = 10; → "p에 적힌 우편함을 열고 10을 넣는다"
47---
48포인터를 모르면 C를 안다고 할 수 없는 이유
49- C 표준 라이브러리 함수의 80% 이상이 포인터를 매개변수로 받는다
50- printf의 \%s도 char *(문자열 포인터)를 기대한다
51- 포인터 없는 C = 엔진 없는 자동차 — 움직일 수 없다 (Koenig, 1989)