[C] ํฌ์ธํฐ
๐ ๋ค์ด๊ฐ๋ฉฐ
C์์ ๊ฐ์ฅ ์ด๋ ต๋ค๊ณ ์๋ฌธ๋ ํฌ์ธํฐ ์ฐจ๋ก๋ค. ์ค์ ๋ก ๋ฐฐ์ธ ๋ ํท๊ฐ๋ฆฌ๋ ์ ์ด ๋ง์์ง๋ง, ํต์ฌ์ ํ๋๋ค. โ๋ณ์์ ๊ฐ์ด ์๋๋ผ โ์ฃผ์โ๋ฅผ ๋ด๋๋ค.โ ์ด ๊ด์ ๋ง ์ก์ผ๋ฉด ๋๋จธ์ง๋ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ๋ผ์จ๋ค.
๋จผ์ ๊ธฐ์ด ๊ฐ๋ ๋ถํฐ ์ ๋ฆฌํ์.
| ๊ฐ๋ | ์ ์ |
|---|---|
| ๋ฉ๋ชจ๋ฆฌ | ์ฐ์๋ 1byte ๋จ์ ๊ณต๊ฐ๋ค. ๊ฐ byte๋ ๊ณ ์ ํ ์ฃผ์๋ก ์ ๊ทผ |
| ์ฃผ์ | ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์์น์ ๊ณ ์ ๊ฐ (ํ์ ๊ณผ ๋ฌด๊ด) |
์ฃผ์ ์ฐ์ฐ์ & | ๋ณ์๊ฐ ์ ์ฅ๋ ์ฃผ์๊ฐ์ ๋ฐํ |
์ฐธ์กฐ ์ฐ์ฐ์ * | ํฌ์ธํฐ๊ฐ ๋ด์ ์ฃผ์๋ก ์ฐพ์๊ฐ ๊ทธ ์์ โ๊ฐโ์ ์ฝ๊ธฐ/์ฐ๊ธฐ |
๐ก
int๋ 4byte๋ผ์ ์ฐ์๋ 1byte ร 4์นธ์ ์ ์ฅ๋๋ค. ์ฃผ์๋ ๊ทธ์ค ์ฒซ ๋ฒ์งธ byte(์์์ )๋ฅผ ๊ฐ๋ฆฌํจ๋ค. Windows์์ ์ฃผ์๋ 4byte(16์ง์ 8์๋ฆฌ), Mac/Linux์์๋ 8byte๋ค.
1. ์ฃผ์ ์ถ๋ ฅํด๋ณด๊ธฐ (%p)
%d๋ ์ ์ ์์, %p๋ ์ฃผ์ ์์์ด๋ค. &n์ผ๋ก ๋ณ์ n์ ์ฃผ์๋ฅผ ์ถ๋ ฅํด ๋ณด์.
1
2
3
int n = ...;
printf("๊ฐ = %d\n", n);
printf("์ฃผ์ = %p\n", &n); // %p โ 16์ง์ 8์๋ฆฌ (4byte)
์ฃผ์๋ 16์ง์(0~F)๋ก ํํ๋๋ค. (16์ง์ 2์๋ฆฌ = 1byte)
2. ํฌ์ธํฐ ๋ณ์ โ ๊ฐ์ด ์๋ โ์ฃผ์โ๋ฅผ ๋ด๋๋ค
์ง๊ธ๊น์ง๋ ๋ณ์์ โ๊ฐโ์ ๋ด์๋ค. ํฌ์ธํฐ๋ ๋ณ์์ โ์ฃผ์โ๋ฅผ ๋ด๋๋ค.
1
2
3
int n = 100;
int *p; // int ํ์
ํฌ์ธํฐ ๋ณ์ (ํ์
๋ค์ *)
p = &n; // p์ n์ '์ฃผ์'๋ฅผ ๋ด์
1
2
3
4
5
n p
โโโโโโโโโ โโโโโโโโโโโโ
โ 100 โ โโโโโโโโโโ &n(์ฃผ์) โ
โโโโโโโโโ โโโโโโโโโโโโ
0x...A0 p๋ n์ ๊ฐ๋ฆฌํจ๋ค(pointing)
p์ &n์ ๊ฐ์ด ๊ฐ๋ค. p๋ &๋ฅผ ์ ๋ถ์ฌ๋ ๊ทธ ์์ฒด๊ฐ ์ฃผ์๋ฅผ ๋ด์ ํฌ์ธํฐ ๋ณ์๋ผ์ ์ฃผ์๊ฐ์ด ๋์จ๋ค.
์ฐธ์กฐ ์ฐ์ฐ์ *๋ก ๊ฐ ์ฝ๊ธฐ
1
printf("%d\n", *p); // *p โ p๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์๋ก ๊ฐ์ ๊ทธ ๊ฐ์ ์ฝ์
*p๋ p๊ฐ ๋ด์ ์ฃผ์(=n์ ์ฃผ์)๋ก ์ฐพ์๊ฐ ๊ทธ ๊ฐ 100์ ์ถ๋ ฅํ๋ค.
์ฐธ์กฐ ์ฐ์ฐ์๋ก ๊ฐ ์ฐ๊ธฐ
*๋ ์ฝ๊ธฐ๋ฟ ์๋๋ผ ์ฐ๊ธฐ๋ ๋๋ค.
1
2
int *p2 = &n; // p2๋ n์ ๊ฐ๋ฆฌํด
*p = 500; // p๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ(n)์ ๊ฐ์ 500์ผ๋ก ๋ณ๊ฒฝ
*p = 500; ํ์๋ ๊ฐ์ ๊ณณ์ ๊ฐ๋ฆฌํค๋ n, *p, *p2๊ฐ ๋ชจ๋ 500์ด ๋๋ค.
โ ๏ธ ํฌ์ธํฐ์ ์ง์ ์ซ์๋ฅผ ๋์ ํ๋ ๊ฑด ๋งค์ฐ ์ํํ๋ค.
p = 100;์ด๋ผ๊ณ ์ฐ๋ฉด ์ฐธ์กฐ๊ฐ์ด ์๋๋ผ ์ฃผ์๊ฐ ์์ฒด๊ฐ 100์ด ๋์ด๋ฒ๋ ค ์๋ฑํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
3. ํฌ์ธํฐ ์ฐ์ฐ
๋ค์ด๊ฐ๊ธฐ ์ ์ 3๊ฐ์ง๋ฅผ ์ง์.
| ํญ๋ชฉ | ์๋ฏธ |
|---|---|
| ํฌ์ธํฐ ๋ณ์ | ์ฃผ์๊ฐ ๋ค์ด๊ฐ |
*ํฌ์ธํฐ | ๊ทธ ์ฃผ์๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ |
| ํฌ์ธํฐ ํ์ | ๊ทธ ์ฃผ์๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ํ์ |
๋ฐ๋ผ์ ํฌ์ธํฐ์ +, -๋ฅผ ํ๋ฉด ์ฃผ์๊ฐ์ ์ฆ๊ฐํ๋ ๊ฒ์ด๊ณ , ์ผ๋ง๋งํผ ์ฆ๊ฐํ๋์ง๋ โํฌ์ธํฐ ํ์
โ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
int*(int ํฌ์ธํฐ)๋ ๊ฐ๋ฆฌํค๋ ๊ฐ์ด 4byte๋ผ์,+1ํ๋ฉด ์ฃผ์๊ฐ 4 ์ฆ๊ฐํ๋ค.
n = 555, p = &n์ผ ๋ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ฆฌํ๋ฉด:
| ์ | ๊ฒฐ๊ณผ |
|---|---|
n + 1 | 556 (๋จ์ ์ ์ ๋ง์ ) |
p + 1 | ์ฃผ์๊ฐ +4byte (int๋ผ์) |
*p + 1 | 556 (๊ฐ 555์ +1) |
*(p + 1) | ์ฐ๋ ๊ธฐ๊ฐ (๋ชจ๋ฅด๋ ์ฃผ์๋ฅผ ์ฐธ์กฐ) |
*(p+1)์ 4byte ๋ค์ ์ ์ ์๋ ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก ์ฐ๋ ๊ธฐ๊ฐ์ด ๋์จ๋ค. ๊ดํธ(์ฐ์ฐ ์์)๋ฅผ ์ ํํ ํ์
ํด์ผ ํ๋ค.
1
2
3
4
ํ์
๋ณ +1 ์ฆ๊ฐ๋
short* โ +2 byte
int* โ +4 byte
double* โ +8 byte
4. ํฌ์ธํฐ์ ๋ฐฐ์ด
โ ๋น๋ฐ ํ๋: ์ฌ์ค ๋ฐฐ์ด์ ํฌ์ธํฐ์ ๋ ๋ค๋ฅธ ์ด๋ฆ์ด๋ค. ํฌ์ธํฐ โ์์โ์ธ ์ ์ด๋ค.
๊ทธ๋์ ๋ฐฐ์ด ์ฒจ์ ์ฐ์ฐ์ [ ]๋ ๊ฒฐ๊ตญ ํฌ์ธํฐ ์ฐ์ฐ์ด๋ฉฐ, ๋ค์ ๊ณต์์ด ์ฑ๋ฆฝํ๋ค.
1
arr[n] โก *(arr + n) โ
โ
โ
โ
โ
๋ฐฐ์ด arr = {10, 20, 30}์ ์ฃผ์๋ฅผ ์ดํด๋ณด์. ๋ฐฐ์ด ์ด๋ฆ arr์ &๊ฐ ์ ๋ถ๊ณ , ์์ arr[n]์ &๊ฐ ๋ถ๋๋ค. ๋ฐฐ์ด ์์ฒด๋ ํฌ์ธํฐ(์ฃผ์)์ด๊ณ , ์์๋ ์ ์๊ฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
1
2
3
4
5
6
7
arr[0] arr[1] arr[2]
โโโโโโโโฌโโโโโโโฌโโโโโโโ
โ 10 โ 20 โ 30 โ
โโโโโโโโดโโโโโโโดโโโโโโโ
0x..A0 0x..A4 0x..A8 โ ์ฃผ์๊ฐ 4์ฉ ์ฆ๊ฐ
โฒ
arr == &arr[0] (๋ฐฐ์ด ์ฃผ์ = ์ฒซ ์์์ ์ฃผ์ = ์์์ )
์์ ์ฃผ์๊ฐ 4์ฉ ์ฆ๊ฐํ๊ณ , arr๊ณผ arr[0]์ ์ฃผ์๊ฐ ๊ฐ๋ค. ๋ฐฐ์ด์ ์ฃผ์๋ ๊ณง ์ฒซ ์์์ ์ฃผ์(์์์ )๋ค.
arr + n์ &arr[n]๊ณผ ๊ฐ๊ณ , *(arr + n)์ arr[n]๊ณผ ๊ฐ๋ค. ๊ณต์์ด ์ฑ๋ฆฝํจ์ ํ์ธํ ์ ์๋ค.
ํฌ์ธํฐ ๋ณ์๋ก ๋ฐฐ์ด ์์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ฉด, ๊ทธ ํฌ์ธํฐ๊ฐ ๋ฐฐ์ด์ฒ๋ผ ๋์ํ๋ค.
๋ฐฐ์ด vs ํฌ์ธํฐ ๋ณ์ โ ์ ํฌ์ธํฐ๋ฅผ ์ธ๊น?
๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ค. int arr[3]์ sizeof๊ฐ 4 ร 3 = 12byte์ง๋ง, ๊ทธ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ p๋ sizeof(p)๊ฐ 4byte๋ค. (๋ชจ๋ ํฌ์ธํฐ ์ฃผ์ ์ฉ๋์ ํ์
๊ณผ ๋ฌด๊ดํ๊ฒ 4byte)
๐ก ํฌ์ธํฐ๋ ๋ฉ๋ชจ๋ฆฌ์์ ๋ค๋ฃจ๋ ์ฉ๋์ด ์์ ๋ ๋น ๋ฅธ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค. ๊ทธ๋์ ํฌ์ธํฐ๋ฅผ ์ฐ๋ฉด ๋ ํจ์จ์ ์ธ ์์ ์ ๊ธฐ๋ํ ์ ์๋ค.
5. ์ด์ค ํฌ์ธํฐ
์ด์ค ์ํ๋ฌธ, ๋ค์ฐจ์ ๋ฐฐ์ด์ด ์๋ฏ ํฌ์ธํฐ์๋ ์ด์ค ํฌ์ธํฐ๊ฐ ์๋ค. ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ค.
1
2
3
int num1 = 0;
int *p = &num1; // p๋ num1์ ๊ฐ๋ฆฌํด
int **pp = &p; // pp๋ p๋ฅผ ๊ฐ๋ฆฌํด (์ด์ค ํฌ์ธํฐ)
1
2
3
4
5
6
num1 p pp
โโโโโโโ โโโโโโโโโ โโโโโโโโโ
โ 0 โโโโโโ &num1 โโโโโโ &p โ
โโโโโโโ โโโโโโโโโ โโโโโโโโโ
*p๋ก 1๋ฒ ์ฐธ์กฐ โ num1
**pp๋ก 2๋ฒ ์ฐธ์กฐ โ p ๊ฑฐ์ณ num1
**pp๋ p๋ก ๊ฐ๋ค๊ฐ ๋ค์ num1๋ก ๊ฐ์ผ ํ๋ ๋ ๋ฒ ์ฐธ์กฐํ๋ผ๋ ๋ป์์ **๋ฅผ ์ด๋ค. (NULL์ ์๋ฌด๊ฒ๋ ์๋ ๊ฐ์ผ๋ก, ๋ฐ๋ก ์ ์ธ ์์ด ์ธ ์ ์๋ค.)
num1, *p, **pp๊ฐ ๋ชจ๋ 0์ผ๋ก ๋์ผํ๊ฒ ์ถ๋ ฅ๋๋ค.
6. ์ ๋ฌ ๋ฐฉ์์ ๋ฐ๋ฅธ ํจ์ ํธ์ถ
ํฌ์ธํฐ์ ์ง๊ฐ๋ ํจ์ ํธ์ถ์์ ๋๋ฌ๋๋ค.
| ๋ฐฉ์ | ๋๊ธฐ๋ ๊ฒ | ์๋ณธ ๋ณํ |
|---|---|---|
| Call By Value (๊ฐ์ ์ํ ํธ์ถ) | ๊ฐ์ ๋ณต์ฌ | โ ์์ |
| Call By Reference (์ฐธ์กฐ์ ์ํ ํธ์ถ) | ์ฃผ์(ํฌ์ธํฐ) | โ ์์ |
Call By Value
1
2
3
4
5
void inc1(int n) { n = n + 1; printf("%d\n", n); }
...
int n = 10;
inc1(n); // 11 ์ถ๋ ฅ
inc1(n); // ๋ 11 ์ถ๋ ฅ (์๋ณธ n์ ๊ทธ๋๋ก 10)
๋ ๋ฒ ํธ์ถํด๋ ๋ ๋ค 11์ด๊ณ , main์ n์ ์ฌ์ ํ 10์ด๋ค. ๊ฐ๋ง ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ด๋ค. main์ n๊ณผ inc1์ n์ ์ด๋ฆ๋ง ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ง์ญ๋ณ์๋ค.
Call By Reference
1
2
3
4
void inc2(int *p) { *p = *p + 1; printf("%d\n", *p); }
...
int n = 10;
inc2(&n); // n์ '์ฃผ์'๋ฅผ ๋๊น
์ด๋ฒ์ ํธ์ถ ํ main์ n ๊ฐ์ด ์ค์ ๋ก ๋ฐ๋๋ค. ๊ฐ์ด ์๋๋ผ n์ ์ฃผ์๋ฅผ ๋ณต์ฌํด ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์, ๊ทธ ์ฃผ์๋ก ์ฐพ์๊ฐ ์๋ณธ n์ ์ง์ ์กฐ์ํ ๊ฒ์ด๋ค.
๐ ์ ๋ฆฌ
1
2
3
4
5
6
7
ํฌ์ธํฐ(pointer)
โโ ํต์ฌ ๋ณ์์ '๊ฐ'์ด ์๋๋ผ '์ฃผ์'๋ฅผ ๋ด๋๋ค
โโ ์ฐ์ฐ์ & (์ฃผ์ ๋ฐํ) ยท * (์ฃผ์๋ก ๊ฐ์ ๊ฐ ์ฝ๊ธฐ/์ฐ๊ธฐ)
โโ ์ฐ์ฐ p+1 โ ํ์
ํฌ๊ธฐ๋งํผ ์ฃผ์ ์ฆ๊ฐ (int๋ฉด +4)
โโ ๋ฐฐ์ด arr[n] โก *(arr+n), arr == &arr[0]
โโ ์ด์คํฌ์ธํฐ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ (**pp)
โโ ํจ์ํธ์ถ Call By Value(๋ณต์ฌ, ์๋ณธ ์ ์ง) vs Reference(์ฃผ์, ์๋ณธ ๋ณ๊ฒฝ)
| ๊ฐ๋ | ํ ์ค ์ ์ |
|---|---|
& | ๋ณ์์ ์ฃผ์๋ฅผ ๋ฐํํ๋ ์ฃผ์ ์ฐ์ฐ์ |
* | ์ฃผ์๋ก ์ฐพ์๊ฐ ๊ฐ์ ์ฝ๊ณ ์ฐ๋ ์ฐธ์กฐ ์ฐ์ฐ์ |
arr[n] โก *(arr+n) | ๋ฐฐ์ด ์ฒจ์๋ ๊ณง ํฌ์ธํฐ ์ฐ์ฐ |
| Call By Reference | ์ฃผ์๋ฅผ ๋๊ฒจ ์๋ณธ์ ์ง์ ๋ฐ๊พธ๋ ํธ์ถ ๋ฐฉ์ |
ํฌ์ธํฐ๋ ๊ฒฐ๊ตญ โ์ฃผ์๋ฅผ ํตํด ์๋ณธ์ ์ง์ ์ ๊ทผํ๋คโ๋ ํ๋์ ๊ฐ๋ ์ผ๋ก ์๋ ดํ๋ค. ์ด๋ ต๋ค๊ณ ์๋ฌธ๋ฌ์ง๋ง, ์ด ๊ด์ ์ ์ก๊ณ ๋๋ฉด ๋ฐฐ์ดยทํจ์ยท๊ตฌ์กฐ์ฒด๊ฐ ๋ชจ๋ ์ฐ๊ฒฐ๋๋ ์ ๋ง ์ฌ๋ฏธ์๋ ์์ญ์ด๋ค.

























Comments powered by Disqus.