ํฌ์ธํฐ ๋ฐฐ์ด, ๋ฐฐ์ด ํฌ์ธํฐ ํผ์ฉํ์ฌ ์ฐ๋ค๋ณด๋ฉด ์ด๊ฒ ์ ํํ ๋ฌด์จ ๊ฐ๋ ์ธ์ง ์ค์ค๋ก ๊นจ๋ซ์ง ๋ชปํ๊ณ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
ํ๋ฒ ์ดํดํด๋ณด์.
ํฌ์ธํฐ ๋ฐฐ์ด์ด๋?
ํฌ์ธํฐ ๋ฐฐ์ด์ด๋ ๊ฐ ๋ฐฐ์ด์ ์์๊ฐ ํฌ์ธํฐ(์๋ฃํ์ด ์ฃผ์)์ธ ๊ฒ์ ๋ปํ๋ค.
๋ค์ ์์๋ฅผ ๋ณด์.
char * strArr[3] = { "cat", "dog", "bird" };
printf("%s", strArr[0]);
printf("%s", strArr[1]);
printf("%s", strArr[2]);
strArr๋ ํฌ์ธํฐ ๋ฐฐ์ด์ด๋ค.
๊ฐ ๋ฐฐ์ด์ ์์๊ฐ ํฌ์ธํฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌธ์์ด์ด ์ ํฌ์ธํฐ์ธ๊ฐ?
์ด๋ ๋ฐฐ์ด ์์ ๋ด๋ถ์ ์ผ๋ก ๋ฌธ์์ด์ ์์ ์ฃผ์๋ฅผ ๋ํ๋ด๋ ํฌ์ธํฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
ํฌ์ธํฐ ๋ฐฐ์ด๊ณผ ๋๋ธ ํฌ์ธํฐ
ํฌ์ธํฐ ๋ฐฐ์ด์ ๋ ๋ค๋ฅธ ํํ ๋ฐฉ๋ฒ์ผ๋ก ๋๋ธ ํฌ์ธํฐ๋ฅผ ํ์ฉํ ๋ฐฉ๋ฒ์ด ์๋ค.
int * ptrArr[] = {ptr1, ptr2, ptr3};
int ** dptr = ptrArr;
printf("%d %d %d \n", *(ptrArr[0]), *(ptrArr[1]), *(ptrArr[2]));
printf("%d %d %d \n", *(dptr[0]), *(dptr[1]), *(dptr[2]));
์ ์ฝ๋์ ์คํ ๊ฒฐ๊ณผ๋ ๊ฐ๋ค.
๋๋ธ ํฌ์ธํฐ๋ ์๋ฏธ์ ์ผ๋ก ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๋ ํฌ์ธํฐ๋ฅผ ๋ปํ๋ค.
ํฌ์ธํฐ ๋ฐฐ์ด์ ํฌ์ธํฐ ์์๋ค์ ๊ฐ์ง๋ ๋ฐฐ์ด์ด๊ณ , ์ด๋ ๋๋ธ ํฌ์ธํฐ๊ฐ ํด๋น ํฌ์ธํฐ ๋ฐฐ์ด์ ์ฃผ์๋ฅผ ๊ฐ์ ธ๋ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ด๋ค.
char * arr[] == char ** arr
ํ ๊ฐ์ง ๊ธฐ์ตํด์ผ ํ ๊ฒ์ ์ฃผ์์ + ์ฐ์ฐ์ ํ ๋, ๋ด๋ถ์ ์ผ๋ก ํ์ ์ ์ฌ์ด์ฆ ๋งํผ ์ฆ๊ฐํ๋ค๋ ๊ฒ.
์ด ๊ฐ๋ ์ด ํ์ ๋ค์ฐจ์ ๋ฐฐ์ด ํ์ต ์ ์ฌ์ฉ๋๋ฏ๋ก ๊ธฐ์ตํด๋์.
arr2[1] == *(arr2 + 1)
ํฌ์ธํฐ๋ฅผ ํตํ ๊ฐ์ Swap
void SwapIntPtr(int *p1, int *p2) {
int * temp = p1;
p1 = p2;
p2 = temp;
}
int main(void) {
int num1=10, num2 = 20;
int *ptr1, *ptr2;
ptr1 = &num1, ptr2 = &num2;
printf("*ptr1, *ptr2 : %d %d \n", *ptr1, *ptr2);
SwapIntPtr(ptr1, ptr2);
printf("*ptr1, *ptr2: %d %d \n", *ptr1, *ptr2);
return 0;
}
์์ ์ฝ๋๋ ์๋์ด ๋์ง ์๋๋ค.
c์ธ์ด์์๋ ์คํ ํ๋ ์์ด๋ผ๋ ๊ฐ๋ ์ด ์๋ค.
main ํจ์์์ SwapIntPtr์ด๋ผ๋ ํจ์๋ฅผ ํธ์ถ ํ๋ค๊ณ ํด๋ณด์.
๊ทธ๋ฌ๋ฉด ์คํ ํ๋ ์์์ ํด๋น SwapIntPtr ํจ์๊ฐ ์ฌ๋ผ๊ฐ๋ค. ์ด๋ ์ง์ญ ๋ณ์๋ SwapIntPtr์ด ์ข ๋ฃ๋์ด ์คํ ํ๋ ์์์ ์ฌ๋ผ์ง ๋ ๊ฐ์ด ์ฌ๋ผ์ง๊ณ ๋ง๋ค.
์ด ๋ง์ ๋ฌด์์ ์๋ฏธํ๋๊ฐ?
์ ์ด์ ptr1๊ณผ ptr2 ๋ณ์ ์์ฒด๋ฅผ ๊ทธ๋๋ก ํจ์ ๋ด์ ์ธ์๋ก ์ ๋ฌ ์์ผ์ค๋ค๋ฉด, call by Value๋ก ์ธํด ๊ฐ์ ๋ณต์ฌ๊ฐ ์ผ์ด๋๋ค.
๊ทธ๋ ๊ฒ ๋๋ฉด p1๊ณผ p2๊ฐ ์ง์ง๊ณ ๋ณถ์์ ธ๋, ํจ์๊ฐ ์ข ๋ฃ๋๋ฉด main ํจ์ ๋ด์๋ ์๋ฌด๋ฐ ์ํฅ์ ์ฃผ์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
์ฆ, ๋๊ฒจ์ฃผ๋ ์ธ์๋ ์ฃผ์ ๊ฐ์ด์ด์ผ ํ๊ณ , ๋ฐ๋ ์ธ์๋ ํฌ์ธํฐ์ ํฌ์ธํฐ๋ฅผ ๋ฐ์ ์ ์๋ ๋๋ธ ํฌ์ธํฐ์ด์ด์ผ ํ๋ค.
์ฃผ์ ๊ฐ์ ์ ๋ฌํ๊ธฐ ์ํด ptr1, ptr2 ๋์ &ptr1๊ณผ &ptr2๋ก ๋ฐ๊พธ์ด์ฃผ๊ณ
ํจ์ ๋ด์์ ์ธ์๋ฅผ ๋ฐ์ ๋๋ **p1, **p2๋ก ๋ฐ์์ค๋ค. ๋ฌผ๋ก ํจ์ ์์ p1, p2๋ *p1, *p2๋ก ๋ฐ๊พธ์ด ์ฃผ์ด์ผ ํ๋ค.
๋ฐฐ์ด ํฌ์ธํฐ๋?
ํฌ์ธํฐ์ธ๋ฐ, ๊ทธ ์ฃผ์๋ฅผ ์ฐพ์๊ฐ๋ฉด ๋ฐฐ์ด์ด ๋์จ๋ค.
์๋ฏธ๋ถํฐ ๋งํ์๋ฉด ์์ ๊ฐ์๋ฐ,
์๊ธด ๊ฑธ ๋ณด๋ฉด ๋ญ ์ ๋ ๊ฒ ์๊ธด ๋์ด ๋ค ์๋์ง ํ๋ ์๊ฐ์ด ๋ ๋ค.
char (*p) [10];
๊ฐ๋จํ๊ฒ ์ ๊ทผํด๋ณด์.
๊ฒฐ๊ตญ์ ๋ฐฐ์ด ํฌ์ธํฐ๋ ํฌ์ธํฐ์ด๋ค.
ํฌ์ธํฐ์ธ๋ฐ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ๋์ธ ๊ฒ์ด๋ค.
์ง์คํด์ ๋ณด๋ฉด ์์ ๊ฒฝ์ฐ์๋ char ์์ 10๊ฐ๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์์ ์ง์ํ ์ ์๋ค.
ํฌ์ธํฐ ๋ฐฐ์ด์ ๋ฐฐ์ด์ธ๋ฐ ๊ฐ ์์๊ฐ ํฌ์ธํฐ์ธ ๊ฒ
๋ฐฐ์ด ํฌ์ธํฐ๋ ํฌ์ธํฐ์ธ๋ฐ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ๊ฒ
์ ์ ๋ ์ ์๋ ํ์ ?
์๋์ ๊ฐ์ ๋ณ์์ ๋ํด ์ ์ธ๋ ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์.(๊ฐ๊ฐ์ ๊ฒฝ์ฐ๋ ๋ฐ๋ก ์๊ฐํ๋ค.)
char *** tptr;
tptr = &p;
tptr = q;
tptr์ ํฌ์ธํฐ๊ฐ ์ธ๊ฐ ์ด๋ค.
์ด๋ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋ ํฌ์ธํฐ์ธ ๊ฒ์ด๋ค.
๋ญ ํด๋ณ๋ ์ค์ฒฉ ์๋ฌธ๋ฌธ๊ฐ์ ์๋ฆฌ์ธ์ง.
&p๋ p ๋ณ์์ ์ฃผ์๋ฅผ ๋งํ๋ค.
์ด๊ฒ ์๋ฏธํ๋ ๊ฒ์ p ๋ณ์๊ฐ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋ ํฌ์ธํฐ๋ผ๋ ๊ฒ์ด๋ค.
์ฆ, p๊ฐ ๋ ์ ์๋ ๊ฐ์ ๋ค์๊ณผ ๊ฐ๋ค.
char **p;
ํท๊ฐ๋ฆด ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์.
char **p[10];
char (**p)[10];
๋ณ์ด ๊ต์ฅํ ๋ง๋ค.
๋ง์ ์๋ก ๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ ๊ฒ์ด ํธํ ๊ฒ์ด๋ค.
๋ง์ฝ & ์ฐ์ฐ์๊ฐ ๋ถ์ ๊ฒฝ์ฐ๋ ๋ฐฐ์ด์ ๊ฐ์ ์ฒซ ์ฃผ์๋ฅผ ๋งํ๋ค.
์ฆ, ๊ฐ์ด **์ด๊ฑด ์๋๊ฑด ์๋ฌด๋ฐ ์๊ด ์๋ค๋ ๊ฒ์ด๋ค. ์ฃผ์๋ผ๋ ๋จ์ด์ ์ฃผ๋ชฉํ๋ผ.
๋ค์์ผ๋ก &๊ฐ ๋ถ์ง ์์๋ค๋ฉด, ์ฒซ ๋ฒ์งธ ๊ฐ์ ์๋ฏธํ๋ค.
๋ค์๋งํด ์ฒซ ๋ฒ์งธ ๊ฐ์ ์๋ **(๋๋ธํฌ์ธํฐ)๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๊ฐ ๋๋ค.
char(**p)[10]์ ๊ทผ๋ณธ์ ์ผ๋ก ํ์ ์๋ฌ๊ฐ ๋ ์ ๋ฐ์ ์๋ค.
์๋? ๊ฒฐ๊ตญ ์ด๋ char๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ์ด์คํฌ์ธํฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ, ์ ์ด์ charํ์ ์ ๊ฐ๋ฆฌํค๋ ๊ฒ๊ณผ๋ ๋ค๋ฅด๋ค.
์กด๋ ์ด๋ ต์ง๋ง, ์ฌ๊ธฐ๊น์ง ์ดํดํ๋ค๋ฉด q๋ ์ฝ๊ฒ ์ ์ ์๋ค.
q๋ *** ๊ทธ ์์ฒด๊ฐ ๋์ด์ผ ํ๋ค.
์ฆ, ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ผ๋ ๊ฒ.
char ***q;
char **q[10];
'๐ซ Language > C' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C/C++] typedef, union, enum ํด์ํ๊ธฐ (0) | 2023.06.19 |
---|---|
[C/C++] malloc๊ณผ Stack๊ณผ Heap์ ๊ด๊ณ (1) | 2023.06.18 |
[C/C++] ์๋ ํ ๋น ๋ฌธ์์ด๊ณผ ํฌ์ธํฐ (0) | 2023.06.18 |