IT/์ปดํ“จํŒ…์  ์‚ฌ๊ณ 

C์–ธ์–ด์˜ ๋‹ค์ค‘ ํฌ์ธํ„ฐ

Unused 2025. 4. 13. 01:08

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 = &num; 
    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[]       โ”‚  ← ๋ฐ”๊พธ๊ณ  ์‹ถ์€ ์ง„์งœ ๋Œ€์ƒ
          โ””----------------------------โ”˜

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

 

์ด๋ ‡๊ฒŒ ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ๋‹ค์ค‘ ํฌ์ธํ„ฐ์˜ ๊ฐœ๋…, ํ™œ์šฉ ์‚ฌ๋ก€, ๊ทธ๋ฆฌ๊ณ  ๋ฌด์—‡๋ณด๋‹ค๋„ ์ค‘์š”ํ•œ ํ”ผํ˜ธ์ถœ ํ•จ์ˆ˜์—์„œ ๋ณ„์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.