* 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

+ Recent posts