
Unused์ C์ธ์ด ํฌ์ธํฐ ์๋ฆฌ์ฆ
ํฌ์คํธ | URL |
C์ธ์ด์ ํฌ์ธํฐ (๊ธฐ์ด) | https://unused.tistory.com/221 |
C์ธ์ด์ ํฌ์ธํฐ ์ดํด: ์ ์ธ์ผ๋ก์์ *, ์ฐ์ฐ์๋ก์์ * | https://unused.tistory.com/217 |
C์ธ์ด์ ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ | https://unused.tistory.com/220 |
C์ธ์ด์ ๋ค์ค ํฌ์ธํฐ | https://unused.tistory.com/215 |
C์ธ์ด์์ ํฌ์ธํฐ๋ ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ง์ ๋ค๋ฃจ๋ ์ค์ํ ๊ฐ๋ ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํฌ์ธํฐ๋ฅผ ๋ค๋ฃจ๋ค ๋ณด๋ฉด ๋ณ์ด 2๊ฐ ์ด์, ์ฆ ๋ค์ค ํฌ์ธํฐ๋ฅผ ์จ์ผ๋ง ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์ฐจ์ ๋ฐฐ์ด์ ๋ค๋ฃจ๊ฑฐ๋, ํจ์์์ ํฌ์ธํฐ ์์ฒด๋ฅผ ์์ ํ ๋ ๋ค์ค ํฌ์ธํฐ(pointer to pointer)๊ฐ ํ์ํฉ๋๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ ํฌ์ธํฐ(*
) ๋ฐ ์ฃผ์๊ฐ ์ฐ์ฐ์(&
)์ ๋ํ ๊ฐ๋ตํ ๋ณต์ต๊ณผ ํจ๊ป, ๋ค์ค ํฌ์ธํฐ์ ๊ฐ๋
์ ์ดํดํ๊ณ , ์ด๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์ ์ ํจ๊ป ์ค๋ช
ํด๋ณด๊ณ ์ ํฉ๋๋ค. ๋ํ ๋ณ์ด ๋ฌด์์ ๋์ด๋๋ ์์ "๋ณ์ด ๋ค์ฏ ๊ฐ"์ ์ด๋ฅผ ๋ง์ ๋ฐฉ๋ฒ์ ๋ํด์๋ ํ๋ฒ ์์๋ณด๊ฒ ์ต๋๋ค.
0. ๋จ์ผ ํฌ์ธํฐ ๋ณต์ต
๋จผ์ ๋จ์ผ ํฌ์ธํฐ๋ฅผ ๋ณต์ตํด๋ด ์๋ค. ๋จ์ผ ํฌ์ธํฐ๋ ํน์ ๋ณ์์ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ ๋ณ์์ ๋๋ค.
int value = 42;
int *p = &value; // 'p'๋ 'value'์ ์ฃผ์๊ฐ์ ์ ์ฅํ๋ ํฌ์ธํฐ
์ด๋ ๋ญ๋ฑ๊ทธ๋ฆฌ๋ฉด ์๋์ ๋ค๋ฅผ ๋ฐ๊ฐ ์์ต๋๋ค. (value
์ ์ฃผ์๊ฐ์ 0x12341234
์์ ๊ฐ์ )
int value = 42;
int *p = 0x12341234;
๋์ํํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
+---------------------------------------------------------+ 0xFFFFFFFF
| |
| (... ์๋ต ...) |
| |
+---------------------------------------------------------+
| int *p = &value --> 0x12341234 | โ p
+---------------------------------------------------------+ (๊ทธ๋ผ ์์ ์ฃผ์๊ฐ์?)
| |
| (... ์๋ต ...) |
| |
+---------------------------------------------------------+
| int value = 42 | โ value
+---------------------------------------------------------+ 0x12341234
| |
| (... ์๋ต ...) |
| |
+---------------------------------------------------------+ 0x00000000
์ ์์ ์์ p
๋ value
์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ํฌ์ธํฐ์ด๋ฉฐ, &value
๋ ๊ณง value
์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ์ ธ์ค๋ ์ฐ์ฐ์์
๋๋ค. ์ด๋ ๊ฒ, *p
๋ฅผ ์ฌ์ฉํ๋ฉด value
์ ๊ฐ์ ๊ฐ์ ์ ์ผ๋ก ์ฐธ์กฐํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ธ์๋ฅผ ํจ์๋ก ๋๊ธธ ๋ callee1(value)
, ์ฆ, callee1(42)
๊ฐ์ ์์ผ๋ก ์ฐ๋ฉด ๊ทธ๊ฒ call-by-value์
๋๋ค. callee1(&value)
, ์ฆ, callee1(0x12341234)
์ฒ๋ผ ์ฐ๋ฉด ๊ทธ๊ฒ ๋ฐ๋ก call-by-reference์
๋๋ค.
๊ทธ๋ฐ๋ฐ, ์๊ฐํด๋ณด๋ฉด, *p
๋ํ ํ๋์ ๋ณ์์
๋๋ค. ์ฃผ์๊ฐ์ ๋ด๋ ๋ณ์.
๊ทธ๋ ๋ค๋ฉด... ์ ์ญ์ ๋ฉ๋ชจ๋ฆฌ ์ด๋๊ฐ์ ๋ณด๊ด๋์ด ์๋ ๊ฑฐ๊ฒ ์ฃ ? ์ด ๋ณ์์ ์ฃผ์๊ฐ์ ๋ด๊ธฐ ์ํ ๊ฒ ์๋์ **pp
, ์ฆ, ๋ค์ค ํฌ์ธํฐ ๋์๊ฒ ์ต๋๋ค.
int value = 42;
int *p = &value; // 'p'๋ 'value'์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ํฌ์ธํฐ
int **pp = &p; // 'pp'๋ 'p'์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ํฌ์ธํฐ
1. ๋ค์ค ํฌ์ธํฐ

๋ค์ค ํฌ์ธํฐ๋ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก, ์ฆ, ํฌ์ธํฐ์ ์ฃผ์๋ฅผ ๋ด๋ ํฌ์ธํฐ์ ๋๋ค. ์๋ ๊ฐ๋จํ ์์๋ฅผ ๋ณด์๊ฒ ์ต๋๋ค.
#include <stdio.h>
int main() {
int num = 302;
int *ptr1 = #
int **ptr2 = &ptr1;
int ***ptr3 = &ptr2;
printf("num (original): %d\n", num);
printf("ptr1: 0x%08X\n", ptr1);
printf("*ptr1: %d\n", *ptr1);
printf("ptr2: 0x%08X\n", ptr2);
printf("*ptr2: 0x%08X\n", *ptr2);
printf("**ptr2: %d\n", **ptr2);
printf("ptr3: 0x%08X\n", ptr3);
printf("*ptr3: 0x%08X\n", *ptr3);
printf("**ptr3: 0x%08X\n", **ptr3);
printf("***ptr3: %d\n", ***ptr3);
return 0;
}

์ด๋ฅผ ๋์ํํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
+---------------------------------------------------------+ 0xFFFFFFFF
| |
| (... ์๋ต ...) |
| |
+---------------------------------------------------------+
| int ***ptr3 = &ptr2 --> 0xFFFFDA48 | โ ptr3
+---------------------------------------------------------+
| int **ptr2 = &ptr --> 0xFFFFDA40 | โ ptr2
+---------------------------------------------------------+ 0xFFFFDA48
| int *ptr = &num --> 0xFFFFDA3C | โ ptr
+---------------------------------------------------------+ 0xFFFFDA40
| int num = 302 | โ num
+---------------------------------------------------------+ 0xFFFFDA3C
โ โ โ
| | |
*ptr **ptr2 ***ptr3
(=302) (=302) (=302)
๋ค์ค ํฌ์ธํฐ๋ ๋ณดํต ์ด๋ฌํ ๊ฒฝ์ฐ ์ฌ์ฉ๋ฉ๋๋ค. 1) ๋ค์ฐจ์ ๋ฐฐ์ด/๊ตฌ์กฐ์ฒด๋ก ์ ๊ทผ, 2) ํจ์์ call-by-reference๋ก ๋๊ฒจ ํฌ์ธํฐ ์์ฒด๋ฅผ ์์ . ์ด ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ์๋์์ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1.1. ๋ค์ค ํฌ์ธํฐ๋ก ๋ฐฐ์ด/๊ตฌ์กฐ์ฒด ์ ๊ทผํ๊ธฐ
๋ค์ด๊ฐ๊ธฐ์ ์์, ์ด ํฌ์คํธ์์ ๋ฐฐ์ด์ด ์ฌ์ค ํฌ์ธํฐ์ฒ๋ผ ์ฐ์ธ๋ค๋ ๊ฒ์ ์ดํด๋ณด์๊ธฐ๋ฅผ ์ถ์ฒ ๋๋ฆฝ๋๋ค.
์ด์ ๋ฐฐ์ด/๊ตฌ์กฐ์ฒด์ ๋ค์ค ํฌ์ธํฐ๋ฅผ ์ดํด๋ด
์๋ค. ๋ค์ค ํฌ์ธํฐ๋ 2์ฐจ์ ์ด์์ ๋ฐฐ์ด์ ๋ค๋ฃฐ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ฐ๋ น ์๋์ ๊ฐ์ 5ํ 3์ด (3x5) ๋ฐฐ์ด์ ๊ฐ์ ํฉ์๋ค. ์ด๋ ์ฆ int[3]
์ง๋ฆฌ ๋ฐฐ์ด์ 5๊ฐ ์๋ ๊ฒ์ด๊ฒ ์ฃ ?
int arr[5][3] = {
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 },
{10, 11, 12 },
{13, 14, 15 }
};
๊ทธ๋์ ์๋์ ๊ฐ์ด ์ ์ธํ๋ฉด p๋ ์ ์ 3๊ฐ๋ฅผ ๋ด๋ (= int[3]
์ ๋ด๋) 1๊ฐ ํ์ง๋ฆฌ ํฌ์ธํฐ๊ฐ ๋ฉ๋๋ค.
int (*p)[3] = arr; // "3๊ฐ์ int๋ก ๊ตฌ์ฑ๋ ๋ฐฐ์ด์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ"๋ฅผ ์ ์ธ, arr์ ๋งจ ์ ์ฃผ์๋ฅผ ๋์
/* ์ฆ,
โ p์ ํ์
์ ํฌ์ธํฐ (์ ํํ๋ int (*)[3])
โ *p์ ํ์
์ int[3]
โ p[i]๋ i๋ฒ์งธ ํ(๋ฐฐ์ด)
โ p[i][j]๋ ๊ทธ ํ์ j๋ฒ์งธ ์์
*/
์ด๋ ๋ง์น 2์ฐจ์ ๋ฐฐ์ด์ฒ๋ผ ์ ๊ทผ ๊ฐ๋ฅํฉ๋๋ค.
for (int i = 0; i < 5; i++)
for (int j = 0; j < 3; j++)
printf("%d ", p[i][j]); // 2์ฐจ์ ๋ฐฐ์ด์ฒ๋ผ ์ ๊ทผ ๊ฐ๋ฅ
printf("\n");
์๋๋ ์ฝ๋์ ๋ถ๋ช ํฌ์ธํฐ๊ฐ ์์ง๋ง ์ธ์๊ฐ call-by-reference๋ก ๋์ด๊ฐ๋ ์์์ ๋๋ค.
#include <stdio.h>
void printMatrix(int matrix[3][4]) {
printf("Matrix:\n");
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++)
printf("%3d ", matrix[i][j]);
printf("\n");
}
}
void modifyMatrix(int matrix[3][4]) {
for (int i=0; i<3; i++) {
for (int j=0; j<4; j++)
matrix[i][j] = matrix[i][j] * 10;
}
}
int main() {
int myArray[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
printf("์์ ์ :\n");
printMatrix(myArray);
printf("modifyMatrix๋ก ๋ค์ด๊ฐ๋๋ค...\n");
modifyMatrix(myArray);
printf("modifyMatrix ์๋ฃ!\n");
printf("์์ ํ:\n");
printMatrix(myArray);
return 0;
}
์คํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค. ๋ถ๋ช & ๋ถ์ธ ์ ์๊ณ , * ์ด ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํจ์๋ฅผ ํ๋ฒ ๊ฑฐ์น๋ ๊ฐ์ด ๋ฐ๋์์ต๋๋ค.

์๋๋ ํ๋ ์ผ์ ๋๊ฐ์ง๋ง ๋ฐฐ์ด์ ํฌ์ธํฐ ๋ณ์๋ก ๋ฐ๋ ์์์ ๋๋ค.
#include <stdio.h>
void printMatrix(int (*matrix)[4], int rows, int cols) {
printf("Matrix:\n");
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++)
printf("%3d ", matrix[i][j]);
printf("\n");
}
}
void modifyMatrix(int (*matrix)[4], int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++)
matrix[i][j] = matrix[i][j] * 10;
}
}
int main() {
int myArray[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
printf("์์ ์ :\n");
printMatrix(myArray, 3, 4);
printf("modifyMatrix๋ก ๋ค์ด๊ฐ๋๋ค...\n");
modifyMatrix(myArray, 3, 4);
printf("modifyMatrix ์๋ฃ!\n");
printf("์์ ํ:\n");
printMatrix(myArray, 3, 4);
return 0;
}
1.2. ๋ค์ค ํฌ์ธํฐ๋ก ํผํธ์ถ ํจ์์์ ํฌ์ธํฐ ์์ฒด๋ฅผ ์์ ํ๊ธฐ
int val = 42;
int *ptr1 = &val; // ํฌ์ธํฐ ptr1๋ val์ ์ฃผ์๋ฅผ ์ ์ฅ
int **ptr2 = &ptr2; // ์ด์ค ํฌ์ธํฐ ptr2๋ ptr1์ ์ฃผ์๋ฅผ ์ ์ฅ
์ ์ฝ๋๋ ์ ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธ ๋ฐ &ptr2๋ฅผ ๋์
ํ๋๋ฐ, ๊ทธ ๋์ , callee1(&ptr2);
๋ก ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถํ๋ฉด, ์ด๊ฒ ๋ฐ๋ก ํจ์์์ ํฌ์ธํฐ ์์ฒด๋ฅผ ์์ ํ๋ ์์๊ฐ ๋ฉ๋๋ค. ๊ทธ๋ ๊ฒ callee1
์ ํ๋ผ๋ฏธํฐ๋ ๋ณ์ด ํ๋ ๋์ด๋ฉ๋๋ค.
#include <stdio.h>
#include <stdlib.h>
void callee1(int ***ptr3) {
**ptr3 = (int *)malloc(sizeof(int));
if (**ptr3 == NULL)
return;
***ptr3 = 321; // 321์ ๋์
}
int main() {
int value = 123;
int *ptr1 = &val;
int **ptr2 = &ptr1;
printf("ํธ์ถ ์ value: %d\n", **ptr2); // ์ถ๋ ฅ ๊ฒฐ๊ณผ 123
callee1(&ptr2);
printf("ํธ์ถ ํ value: %d\n", **ptr2); // ์ถ๋ ฅ ๊ฒฐ๊ณผ 321
free(*ptr2);
}
์ด๋ฒ์๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์์๋ก ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์๋ ์ฝ๋๋ ๊ฐ๋จํ ์ด์ง ํ์ ํธ๋ฆฌ (BST) ์์ ์ ๋๋ค.
#include <stdio.h>
#include <stdlib.h>
typedef struct _bstnode{
int item;
struct _bstnode *left;
struct _bstnode *right;
} BSTNode;
void insertBSTNode(BSTNode **node, int value){
if (*node == NULL){
*node = malloc(sizeof(BSTNode));
if (*node != NULL) {
(*node)->item = value;
(*node)->left = NULL;
(*node)->right = NULL;
}
}else{
if (value < (*node)->item)
insertBSTNode(&((*node)->left), value);
else if (value >(*node)->item)
insertBSTNode(&((*node)->right), value);
else
return;
}
}
void inOrderTraversal(BSTNode *root){
if (root == NULL)
return;
else{
inOrderTraversal(root->left);
printf("%d ", root->item);
inOrderTraversal(root->right);
}
}
int main(){
int c, i;
c = 1;
BSTNode *root;
root = NULL;
printf("์ด์ง ํ์ ํธ๋ฆฌ์ ๋ฃจํธ์ ๋ฃ์ ๊ฐ ์
๋ ฅ: ");
scanf("%d", &i);
insertBSTNode(&root, i);
printf("์
๋ ฅ ํ BST: ");
inOrderTraversal(root);
printf("\n");
return 0;
}
์ฌ๊ธฐ์ ํนํ ์ฃผ๋ชฉํด์ผ ํ ๊ฒ์ ๋ฐ๋ก ๋
ธ๋ ์ฝ์
์ ์ํ insertBSTNode
์ ๋ด์ฉ๋ฌผ ์ถ๋ ฅ์ ์ํ inOrderTraversal
์ ํ๋ผ๋ฏธํฐ ์ฐจ์ด์
๋๋ค. ์๋ ๋ณด์๋ค์ํผ ์ ์๋ **node
, ํ์๋ *root
๋ฅผ ๋ฐ์ต๋๋ค. ์ด์ ๊ฐ ๋ฌด์์ผ๊น์?

๋ฐ๋ก ์ ์๋ root
๋
ธ๋๋ฅผ ์์ , ํ์๋ ์ฝ๊ธฐ๋ง ์ํํ๊ธฐ ๋๋ฌธ์
๋๋ค.
insertBSTNode
๋ ํธ์ถ๋ ๋ค ๋ฃจํธ ๋
ธ๋๊ฐ NULL
์ด๋ฉด ์๋ก์ด ๋
ธ๋๋ฅผ ํ ๋นํ์ฌ root
ํฌ์ธํฐ๋ฅผ ์
๋ฐ์ดํธํ๋๋ฐ, ๋ง์ฝ ์ด๊ฑธ *
๋ก ๋ฐ์ผ๋ฉด ๋ฃจํธ ๋
ธ๋๊ฐ ์
๋ฐ์ดํธ๋์ด๋ ํด๋น ํจ์ ํ์ ์ด ๋๋ฉฐ, main()
์ผ๋ก ๋์๊ฐ๋ ์๊ฐ ํด๋น ์์ ์ฌํญ์ ๋ฒ๋ ค์ง๋๋ค. ๊ทธ๋ ๊ธฐ์ ํฌ์ธํฐ์ ํฌ์ธํฐ๋ฅผ ์ธ์๋ก ๋ฐ๋ ๊ฒ์
๋๋ค.
ํํธ inOrderTraversal
์ ํธ๋ฆฌ์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋
ธ๋ ํฌ์ธํฐ(*root
)๋ฅผ ์ฌ์ฉํฉ๋๋ค.

๊ทธ๋ ๊ฒ ์ฐ๋ฆฌ๋ "์ํ! insertBSTNode(&root, i)์ฒ๋ผ &root๋ฅผ ๋๊ธฐ๋ฉด ์์ ์ด ๋๊ณ inOrderTraversal(root)์ฒ๋ผ root๋ฅผ ๋๊ธฐ๋ฉด ์ฝ๊ธฐ๋ง ๋๋๊ตฌ๋!" ๊ฐ์ ๋จ์ํ ์๊ฐ์ ํ๊ฒ ๋ฉ๋๋ค.
2. ๋ณ์ด ๋ค์ฏ ๊ฐ!

ํน์ ์ ๋ด์ฉ์ ๋ณด๊ณ "ํจ์๊ฐ ํ๋ ํธ์ถ๋ ๋๋ง๋ค ๋ณ์ด ํ๋์ฉ ๋์ด๋๋ ๊ฑด๊ฐ?"๋ผ๊ณ ์๊ฐํ์ จ๋ค๋ฉด, ๋ค, ์ ๋ต์ ๋๋ค. "์์ ์ ์ํด &๋ฅผ ๋ถ์ด๋๊ตฌ๋"๋ผ๋ ์๊ฐ์ผ๋ก ์ง๋ค ๋ณด๋ฉด, ์๋์ ๊ฐ์ด ๋ณ์ด ๋ค์ฏ ๊ฐ๋ฅผ ๋ณด๋ ๊ธฐ์ ์ ๊ฒฝํํ์ค ์ ์์ต๋๋ค.
#include <stdio.h>
void callee3(char *****p4) {
static char *new_data[] = { "๋ณ์ด", "๋ค์ฏ", "๊ฐ!!!!!", NULL };
***p4 = new_data;
}
void callee2(char ****p3) {
printf("ํ์ฌ callee2. callee3์๊ฒ ๋๊น.\n");
callee3(&p3);
}
void callee1(char ***p2) {
printf("ํ์ฌ callee1. callee2์๊ฒ ๋๊น.\n");
callee2(&p2);
}
int main() {
static char *original[] = { "ํ๋", "๋", "์
", NULL };
char **asdasd = original;
printf("์์ ์ : %s, %s, %s\n", asdasd[0], asdasd[1], asdasd[2]); // ํ๋ ๋ ์
callee1(&asdasd); // ๋ณ์ ํฅ์ฐ ์์!
printf("์์ ํ: %s, %s, %s\n", asdasd[0], asdasd[1], asdasd[2]); // ๋ณ์ด ๋ค์ฏ ๊ฐ!!!!!
return 0;
}

์ฝ๋๋ฅผ ์ ๋ ๊ฒ ์ง๋ฉด ๋ ๊น์? ์๋ ๊น์? ๋ฌผ๋ก ๊ฐ๋ฐ์ ๊ฐ๊ฐ์ธ์ ํน์ดํ ์ทจํฅ์ ์ ๋ ์กด์คํด ๋ง์ง์์ต๋๋ค๋ง, ํ์ ์ ์ํด ์ ํฌ๊ฐ ๊ณ ๋ฅผ ์ ์๋ ์ ํ์ง๋ ๊ทธ๋ ๊ฒ ๋ค์ํ์ง ์์ ์๋ ์์์ ํญ์ ์ ๋ ํด์ผ ํ ๊ฒ์ ๋๋ค. ์๋๋ ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ์ง๋ง ์ค๊ณง ๋ณ 3๊ฐ๋ฅผ ์ ์งํ๋ ์ฝ๋์ ๋๋ค.
#include <stdio.h>
void callee3(char ***p2) {
static char *new_data[] = { "๋ณ์ด", "๋์ด๋์ง", "์์!", NULL };
*p2 = new_data;
}
void callee2(char ***p2) {
printf("ํ์ฌ callee2. callee3์๊ฒ ๋๊น.\n");
callee3(p2);
}
void callee1(char ***p2) {
printf("ํ์ฌ callee1. callee2์๊ฒ ๋๊น.\n");
callee2(p2);
}
int main() {
static char *original[] = { "ํ๋", "๋", "์
", NULL };
char **asdasd = original;
printf("Before: %s, %s, %s\n", asdasd[0], asdasd[1], asdasd[2]); // ํ๋ ๋ ์
callee1(&asdasd); // asdasd์ ์ฃผ์๋ฅผ ๋๊ฒจ์ค.
printf("After: %s, %s, %s\n", asdasd[0], asdasd[1], asdasd[2]); // ๋ณ์ด ๋์ด๋์ง ์์!
return 0;
}

๋ถ๋ช ํ ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ๋๋ฐ, ์ ์๋๋ ๋ณ์ด ๋์ด๋์ง ์์๊น์?
๊ทธ ์์ธ์ ์ธ์๋ฅผ ๊ฐ์ผ๋ก ๋๊ธฐ๋๋, ์ฃผ์ ์์ฒด๋ฅผ ๋๊ธฐ๋๋์ ์ฐจ์ด์
๋๋ค. ์๋ ์ฝ๋๋ main()
์์ ์ ์ธํ asdasd
(ํ์
char **
, ์ฆ ๋ณ 2๊ฐ)์ ์ฃผ์๋ฅผ ๋๊ธฐ๊ธฐ์, callee1
์ด ๋ฐ์ ๊ฒ์ ์ด ๊ฐ์ ๋ณต์ฌ๋ณธ(๋ณ 2๊ฐ์ง๋ฆฌ ๋ณ์)์
๋๋ค. ๋ฌธ์ ๋ ์ดํ์๋ ๊ณ์ ์ฃผ์๋ฅผ ๋๊ธด๋ค๋ ๋ฐ์ ์์ต๋๋ค. &
์ฐ์ฐ์๋ฅผ ์ ์ฉํ์ฌ, ํผํธ์ถ ํจ์๋ค์ด ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ๊ฒ์ ๊ฒฐ๊ตญ ๋ฐ๋ก ์ง์ ํธ์ถ์์ ๋ก์ปฌ ๋ณต์ฌ๋ณธ์ ์ฃผ์๊ฐ์
๋๋ค (&asdasd โ &p2 โ &p3 โ &p4 โ &p5 โ &p6 โ ...). ์ด์ ๋ํ์ฌ ์๋์ ๊ฐ์ด ๋์ํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
"๋ณ์ด ๋ค์ฏ ๊ฐ"์ ๋ฉ๋ชจ๋ฆฌ ๋์ํ
โ----------------------------โ
callee3 โ p4 -> &p3 (callee2์ ๋ก์ปฌ) โ
โ----------------------------โ
callee2 โ p3 -> &p2 (callee1์ ๋ก์ปฌ) โ
โ----------------------------โ
callee1 โ p2 -> &asdasd (main์ ๋ก์ปฌ) โ
โ----------------------------โ
main โ asdasd -> original[] โ โ ๋ฐ๊พธ๊ณ ์ถ์ ์ง์ง ๋์
โ----------------------------โ
๋ฐ๋ฉด, ์์ ๋ ์ฝ๋์์๋ main()
์ ๋ณ์ asdasd
์ ๋ํ ์ฃผ์(ํ์
char ***
, ์ฆ ๋ณ 3๊ฐ)๋ฅผ ๋๊ฒจ์ค ๋ค, ์ดํ ํผํธ์ถ ํจ์์์๋ ํด๋น ์ฃผ์๊ฐ์ ๊ฐ์ผ๋ก ๋๊น๋๋ค. ์ฆ ํผํธ์ถ ๋ ๋ฒจ์ด ๋ช์ด ๋๋ ๊ฒฐ๊ตญ ํ๋ผ๋ฏธํฐ๋ก ๋์ด๊ฐ๋ ๊ฒ์ ๋์ผํ &asdasd์
๋๋ค. ์ด๋ฅผ ํตํด ํธ์ถ ๊ณ์ธต ๋ด๋ด ๋์ผํ ํฌ์ธํฐ ๋ ๋ฒจ(๋ณ 3๊ฐ)์ ์ ์งํ๋ฉด์ ์๋ณธ ๋ณ์์ ์ง์ ์ ๊ทผํ ์ ์๊ฒ ๋ฉ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ชจ๋ ํผํธ์ถ ํจ์๋ค์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์์ผ๋ฏ๋ก, ์ต์ข
์ ์ผ๋ก ํฌ์ธํฐ ๋ ๋ฒจ์ ๋ณํจ ์์ด๋ callee3
์์ ์์ ํ ๊ฐ์ธ new_data
๊ฐ main()
์ asdasd
์ ๋ฐ์๋์ด ์ถ๋ ฅ๋ฉ๋๋ค. ์ด๋ ์๋์ ๊ฐ์ด ๋์ํ๋ ์ ์์ต๋๋ค.
"๋ณ์ด ๋์ด๋์ง ์์"์ ๋ฉ๋ชจ๋ฆฌ ๋์ํ
โ----------------------------โ
callee3 โ p2 -> &asdasd (main์ ๋ก์ปฌ) โ
โ----------------------------โ
callee2 โ p2 -> &asdasd โ
โ----------------------------โ
callee1 โ p2 -> &asdasd โ
โ----------------------------โ
main โ asdasd -> original[] โ โ ๋ฐ๊พธ๊ณ ์ถ์ ์ง์ง ๋์
โ----------------------------โ
์ฆ, ํฌ์ธํฐ๋ฅผ ์ฌ๋ฌ ํจ์์ ๋๊ธธ ๋ ํผํธ์ถ ํจ์์๊ฒ ๋ณด๋ด๋ ํฌ์ธํฐ์ ๋ ๋ฒจ์ด ๋ฌ๋ผ์ง๋ ์ด์ ๋, ๊ฐ์ผ๋ก ์ ๋ฌ๋ ํฌ์ธํฐ์ ๋ณต์ฌ๋ณธ์์ ์ถ๊ฐ์ ์ธ ์ฃผ์ ์ฐ์ฐ์ ์ํํ๋ฉด ์๋ณธ๊ณผ๋ ๋ถ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์ ์์ ์ด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ฅผ ํผํ๊ธฐ ์ํด์๋ ์ฒ์๋ถํฐ ์๋ณธ ๋ณ์์ ์ฃผ์๋ฅผ ์ ๋ฌํด ๋ชจ๋ ํจ์๋ค์ด ๋์ผํ ๋ ๋ฒจ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ํด์ผ ํฉ๋๋ค.
์ด๋ ๊ฒ ์ด๋ฒ ํฌ์คํธ์์๋ ๋ค์ค ํฌ์ธํฐ์ ๊ฐ๋ , ํ์ฉ ์ฌ๋ก, ๊ทธ๋ฆฌ๊ณ ๋ฌด์๋ณด๋ค๋ ์ค์ํ ํผํธ์ถ ํจ์์์ ๋ณ์ด ์ฆ๊ฐํ๋ ๊ฒ์ ๋ง๋ ๋ฐฉ๋ฒ์ ๋ํ์ฌ ์์๋ณด์์ต๋๋ค.
'IT > ์ปดํจํ ์ ์ฌ๊ณ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ ๋-๋ธ๋ ํธ๋ฆฌ (Red-Black Tree) (0) | 2025.04.18 |
---|---|
C์ธ์ด์ ํฌ์ธํฐ (๊ธฐ์ด) (0) | 2025.04.17 |
C์ธ์ด์ ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ (0) | 2025.04.17 |
C์ธ์ด์ ํฌ์ธํฐ ์ดํด: ์๋ฃํ์ผ๋ก์์ *์ ์ญ์ฐธ์กฐ ์ฐ์ฐ์๋ก์์ * (2) | 2025.04.14 |
์ด๋ถ ํ์๊ณผ Python์ bisect_left (0) | 2025.03.27 |
Python ์ปดํ๋ฆฌํจ์ ๋ฐ ํํ์ ์ ๋ฆฌ (0) | 2025.03.27 |
[์คํฌ๋ฉ] CS:APP ๋นํธ์ฐ์ฐ ๊ณผ์ bits.c ๋ต์ (0) | 2016.11.06 |
์๋ ํ์ธ์.
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!