C์–ธ์–ด

[C์–ธ์–ด] *ํฌ์ธํ„ฐ์˜ **ํฌ์ธํ„ฐ ์ด์ค‘ํฌ์ธํ„ฐ ๊ฐœ๋…

hyonie 2025. 1. 2. 23:47

ํฌ์ธํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, ์ด์ค‘ ํฌ์ธํ„ฐ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ด์ค‘ ํฌ์ธํ„ฐ์˜ ๊ฐœ๋…๊ณผ ๊ตฌ์กฐ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ• ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

 


์ด์ค‘ํฌ์ธํ„ฐ๋ž€?

์ด์ค‘ํฌ์ธํ„ฐ๋Š” ํฌ์ธํ„ฐ์˜ ํฌ์ธํ„ฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํŠน์ • ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋ฅผ ๋˜ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ตฌ์กฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. 
ํฌ์ธํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. *๊ฐ€ ํ•˜๋‚˜๋“ , ** ์ฒ˜๋Ÿผ ๋‘ ๊ฐœ๋“  ์ƒ๊ด€์—†์ด, *๊ฐ€ ๋ถ™์–ด์žˆ์œผ๋ฉด ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค๋Š” ์ ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

int **pp;

 
์œ„ ์ฝ”๋“œ๋Š” ์ด์ค‘ํฌ์ธํ„ฐ pp๋ฅผ ์„ ์–ธํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ด์ค‘ํฌ์ธํ„ฐ๋Š” "์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ์˜ ์ฃผ์†Œ๊ฐ’"์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด, ๋‹จ์ผ ํฌ์ธํ„ฐ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


1. ๋‹จ์ผ ํฌ์ธํ„ฐ์˜ ๊ฐœ๋…

๋‹จ์ผ ํฌ์ธํ„ฐ๋Š” ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

int a = 5;
int *p;
p = &a;

 
์œ„ ์ฝ”๋“œ๋Š” p๋ผ๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ ๋ณ€์ˆ˜ a์˜ ์ฃผ์†Œ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. 

  • p๋Š” a์˜ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ, *p๋ฅผ ํ†ตํ•ด a์˜ ๊ฐ’์„ ๊ฐ„์ ‘์ ์œผ๋กœ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • p๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณ€์ˆ˜ a์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด "๊ฒฝ๋กœ"๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 
 


 

2. ์ด์ค‘ํฌ์ธํ„ฐ์˜ ๊ตฌ์กฐ

์ด์ค‘ํฌ์ธํ„ฐ๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”:

int a =5;
int *p = &a; // p๋Š” a์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅ
int **pp = &p; // pp๋Š” p์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅ

 
์ด ์ฝ”๋“œ๋Š” ์ด์ค‘ํฌ์ธํ„ฐ์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

  1. pp๋Š” p์˜ ์ฃผ์†Œ๊ฐ’(0x200)์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  2. p๋Š” a์˜ ์ฃผ์†Œ๊ฐ’(0x100)์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  3. a์˜ ๊ฐ’์€ 5๋กœ ์ €์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด, 

  • *pp๋Š” p๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.(์ฆ‰, *pp๋Š” p์™€ ๋™์ผ)
  • **pp๋Š” a์˜ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, pp๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ a์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 


 

3. ์ด์ค‘ํฌ์ธํ„ฐ์˜ ํŠน์ง•๊ณผ ๋™์ž‘์›๋ฆฌ

 

ํŠน์ง•

  • ๋‹จ์ผ ํฌ์ธํ„ฐ: ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅ
  • ์ด์ค‘ ํฌ์ธํ„ฐ: ๋‹จ์ผ ํฌ์ธํ„ฐ์˜ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅ

๋™์ž‘์›๋ฆฌ

**pp๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ํ•œ ๋‹จ๊ณ„๋ฅผ ๋” ๊ฑฐ์ณ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.

  • pp๋Š” p์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๊ณ ,
  • p๋Š” a์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋ฉฐ,
  • **pp๋ฅผ ํ†ตํ•ด a์˜ ์‹ค์ œ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

4. ์ด์ค‘ํฌ์ธํ„ฐ๋ฅผ ํ™œ์šฉ ์ด์œ  (์ฐธ๊ณ )

 

1. ๋‹ค์ฐจ์› ๋ฐฐ์—ด์˜ ์ฒ˜๋ฆฌ

๋‹ค์ฐจ์› ๋ฐฐ์—ด(ํŠนํžˆ 2์ฐจ์› ๋ฐฐ์—ด)์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ด์ค‘ํฌ์ธํ„ฐ๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด

int arr[2][3] = {{1,2,3}, {4,5,6}};
int *p = &arr[0][0];
int **pp = &p;

 

 
p = &arr[0][0]

  • p๋Š” ๋ฐฐ์—ด arr์˜ ์ฒซ ๋ฒˆ์งธ ์›์†Œ(arr[0][0])์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋‹จ์ผ ํฌ์ธํ„ฐ ์ž…๋‹ˆ๋‹ค.
  • ์ด๋ฏธ์ง€์—์„œ p๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” arr[0][0]์˜ ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค.

pp = &p

  • pp๋Š” ํฌ์ธํ„ฐ p์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ์ด์ค‘ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค.
  • pp๋ฅผ ํ†ตํ•ด p์˜ ์ฃผ์†Œ๊ฐ’์„ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ , ๊ฐ„์ ‘์ ์œผ๋กœ arr ๋ฐฐ์—ด์—๋„ ์ ‘๊ทผํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

์ด์ค‘ํฌ์ธํ„ฐ๋Š” ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ๋™์  2์ฐจ์› ๋ฐฐ์—ด์„ ์ƒ์„ฑ ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

int **matrix = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) {
    matrix[i] = (int *)malloc(cols * sizeof(int));
}

 

3. ํ•จ์ˆ˜์—์„œ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ

ํ•จ์ˆ˜์—์„œ ํฌ์ธํ„ฐ์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ด์ค‘ํฌ์ธํ„ฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

void changePointer(int **pp) {
    static int b = 10;
    *pp = &b;
}

 

๊ฒฐ๋ก ์ ์œผ๋กœ

์ด์ค‘ํฌ์ธํ„ฐ๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค. 
์ด๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋” ์ž˜ ๊ด€๋ฆฌํ•˜๊ณ , ๋‹ค์ฐจ์› ๋ฐฐ์—ด, ๋™์  ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ, ํ•จ์ˆ˜์—์„œ ํฌ์ธํ„ฐ ๋ณ€๊ฒฝ ๋“ฑ์˜ ์ƒํ™ฉ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.