ํฌ์ธํฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๋ณ์๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด, ์ด์ค ํฌ์ธํฐ๋ ๋ฌด์์ผ๊น์?
์ด๋ฒ ๊ธ์์๋ ์ด์ค ํฌ์ธํฐ์ ๊ฐ๋
๊ณผ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ์ดํดํ ์ ์๋๋ก ์ ๋ฆฌํด ๋ณด์์ต๋๋ค.
์ด์คํฌ์ธํฐ๋?
์ด์คํฌ์ธํฐ๋ ํฌ์ธํฐ์ ํฌ์ธํฐ๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฆ, ํน์ ๋ณ์์ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ ํฌ์ธํฐ ๋ณ์๋ฅผ ๋ ๋ค๋ฅธ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ตฌ์กฐ๋ฅผ ๋งํฉ๋๋ค.
ํฌ์ธํฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๋ณ์์
๋๋ค. *๊ฐ ํ๋๋ , ** ์ฒ๋ผ ๋ ๊ฐ๋ ์๊ด์์ด, *๊ฐ ๋ถ์ด์์ผ๋ฉด ํด๋น ๋ณ์๋ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ค๋ ์ ์ด ์ค์ํฉ๋๋ค.
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์ ์ฃผ์๋ฅผ ์ ์ฅ
์ด ์ฝ๋๋ ์ด์คํฌ์ธํฐ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋ณด์ฌ์ค๋๋ค.


- pp๋ p์ ์ฃผ์๊ฐ(0x200)์ ์ ์ฅํฉ๋๋ค.
- p๋ a์ ์ฃผ์๊ฐ(0x100)์ ์ ์ฅํฉ๋๋ค.
- 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;
}
๊ฒฐ๋ก ์ ์ผ๋ก
์ด์คํฌ์ธํฐ๋ ํฌ์ธํฐ ๋ณ์์ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ ํฌ์ธํฐ์
๋๋ค.
์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋ ์ ๊ด๋ฆฌํ๊ณ , ๋ค์ฐจ์ ๋ฐฐ์ด, ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, ํจ์์์ ํฌ์ธํฐ ๋ณ๊ฒฝ ๋ฑ์ ์ํฉ์์ ํ์ฉํ ์ ์์ต๋๋ค.
'C์ธ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C์ธ์ด] ํจ์ ํฌ์ธํฐ ์ ์ธ๊ณผ ํ์ฉ (0) | 2025.01.12 |
---|---|
[C์ธ์ด] void๋ ์๋ฃํ์ผ๊น? (0) | 2025.01.04 |
[C์ธ์ด] ๊ฐ ํธ์ถ ๋ฐฉ์(Call by Value)๊ณผ ์ฐธ์กฐ ํธ์ถ ๋ฐฉ์(Call by Reference) (0) | 2025.01.01 |
[C์ธ์ด] ๋ฐฐ์ดํ์ ์ธ์๋ ํฌ์ธํฐํ์ผ๋ก ๋ฐ๋๋ค. (0) | 2024.12.31 |
[C์ธ์ด] ๋ฐฐ์ด ์ด๋ฆ์ ํฌ์ธํฐ์ฒ๋ผ, *ํฌ์ธํฐ๋ฅผ ๋ฐฐ์ด์ฒ๋ผ ์ฌ์ฉํ๊ธฐ (1) | 2024.12.30 |