* Java -> GC . C언어, C++ -> 포인터
🔹 Java vs C / C++
언어메모리 관리 방식특징
| Java | GC (Garbage Collector)가 자동으로 메모리 해제 | 개발자가 직접 메모리 주소에 접근 불가 |
| C / C++ | 포인터(pointer)로 직접 메모리 주소를 제어 | 사용자가 malloc / free, new / delete로 직접 관리 |
🧩 포인터(pointer) 기본 구조
int a = 7; // 변수 a의 값: 7 int* pa = &a; // 포인터 pa가 a의 주소를 저장
표현의미
| &a | 변수 a의 주소값 |
| pa | a의 주소를 저장하는 포인터 변수 |
| *pa | 포인터 pa가 가리키는 주소의 실제 값 (즉, a의 값) 가리키는 곳에 숫자 int가 있다 ! |
📘 예시:
printf("%d", *pa); // 출력: 7
👉 *pa는 “a의 값을 가져와라”는 뜻!
int a = 7

🔁 swap에서의 포인터 활용
포인터는 값을 직접 교환(swap) 할 때 자주 사용돼요.
📘 예시:
void swap(int* x, int* y) { int temp = *x; *x = *y; *y = temp; } int a = 3, b = 7; swap(&a, &b);
✅ 실행 후
a = 7, b = 3
👉 메모리의 값을 직접 바꿨기 때문에 temp 외의 추가 복사 과정이 없음.
int* pa = &a;
print(*pa) => 7
1️⃣ int a = 7;
- 변수 a에 정수 7을 저장함
- 예를 들어, 메모리 어딘가(예: 주소 0x100)에
-
주소: 0x100 값: 7
2️⃣ int* pa = &a;
- int* pa 👉 “정수를 가리키는 포인터 변수 pa를 선언”
- &a 👉 “a의 메모리 주소값을 가져옴”
- 즉, pa는 이제 a가 저장된 주소를 기억함
📘 예시로 보면:
a = 7 pa = 0x100 (a의 주소)
3️⃣ *pa
- *는 간접 참조 연산자(dereference operator) 라고 해요.
- 의미: “pa가 가리키는 주소의 실제 값을 가져와라.”
즉,
- pa 👉 주소값 (예: 0x100)
- *pa 👉 주소 0x100 안에 들어 있는 값 (즉, a의 값 = 7)
4️⃣ printf("%d", *pa);
- *pa는 결국 a의 값(7)을 읽어오는 것
- 출력 결과는 7

int * pa = 0x10F
int * pb = 0x1F7
print(*pa), print(*pb)
가리키는 곳에 숫자(int)가 있다.
temp를 거의 안쓴다.
swap 하려고 쓴다.
직접 메모리를 바꿔준다.
🔡 문자 포인터 (char*)
char* str = "Hello";
구분의미
| char* | 문자(char)를 가리키는 포인터 |
| "Hello" | 문자 배열 (문자열) |
| 문자열의 끝 | 항상 NULL 문자(\0) 로 종료됨 |
| char* 특징 | 문자열이 어디까지인지 NULL로 구분함 |
📘 예시
char str[] = "Hi";
printf("%c", str[0]); // H
printf("%c", str[1]); // i
printf("%c", str[2]); // \0 (NULL)
👉 문자열(char 배열) 은 마지막에 '\0'을 포함해야 완전한 문자열로 인식됨.
-> C에서는 문자열의 길이 정보를 따로 저장하지 않기 때문이다.
C에서는 문자열을 다룰 때 "문자들이 언제 끝나는지"를 알 수 있는 방법이 없다.
왜냐면 C는 문자열의 길이를 자동으로 기억하지 않기 때문..
int는 “하나의 값”
char 문자열은 “여러 개의 문자가 모인 배열” 그래서 null이 필요!
int* x
x = &a
char *
문자 : 마지막 문자열 null 값을 가질 때까지. char에서만 해당. 문자열에서만...
↓
문자배열 -> 문자열 배열 포인터 - 포인터타입
🧩 기본 포인터 개념
🔹 1️⃣ int* x
- 정수형(int)을 가리키는 포인터 변수
- x에는 “정수 변수의 주소값”이 저장됨
int a = 7; int* x; // int형을 가리키는 포인터 x = &a; // a의 주소를 x에 저장
이름값의미
| a | 7 | 실제 정수 값 |
| x | &a | a의 주소 |
| *x | 7 | x가 가리키는 곳에 7이 있다 |
✅ 특징
- int는 크기가 고정(4바이트)
- 그래서 “어디까지 읽을지”를 컴파일러가 이미 알고 있음
- → 끝 표시(\0)가 필요 없음
🔹 2️⃣ char*
- 문자(char)를 가리키는 포인터 변수
- 하지만 문자열을 다룰 때는 특별 규칙이 있음!
char str[] = "Hi"; char* p = str; // 문자열의 시작 주소를 가리킴
인덱스값설명
| 0 | 'H' | 첫 번째 문자 |
| 1 | 'i' | 두 번째 문자 |
| 2 | '\0' | 문자열의 끝을 알리는 널 문자 |
✅ 특징
- char 자체는 1바이트 문자
- 하지만 "Hi" 같은 문자열은 “끝을 표시하기 위해” '\0'을 반드시 포함
- 그래서 char*로 문자열을 가리킬 때는,
널 문자('\0')가 나올 때까지를 “문자열”로 인식함
int **c = &b;
** -> 이중 포인터 더블 포인터

'기초 CS > 자료구조' 카테고리의 다른 글
| 자바 객체지향 & 메모리 & 배열 정리 (0) | 2025.10.16 |
|---|---|
| Fibonacci 수열 (0) | 2025.09.30 |