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

C์–ธ์–ด์˜ ๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ

Unused 2025. 4. 17. 14:19

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

Credit: https://stackoverflow.com/questions/33829566/for-loop-with-pointer-in-c

์œ„ ์ด๋ฏธ์ง€์˜ for๋ฌธ์„ ํ•œ๋ฒˆ ๋ณด์‹œ์ง€์š”. ํ‰์†Œ ์งœ๋˜ ๊ฒƒ๊ณผ๋Š” ๋‹ค๋ฅด์ง€ ์•Š์œผ์‹ ๊ฐ€์š”? C์–ธ์–ด์—์„œ๋Š” ๋ฐฐ์—ด์ด ๊ณง ํฌ์ธํ„ฐ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ธฐ์— ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

int arr[5] = {10, 20, 30, 40, 50};
int *p = arr;     // p๋Š” arr์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ

์—ฌ๊ธฐ์„œ arr์€ ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ์˜๋ฏธํ•˜์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„์˜ ๋ฌธ๋งฅ์—์„œ๋Š” &arr[0] — ์ฆ‰, ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์˜ ์ฃผ์†Œ๋กœ ์ž๋™ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ p๋Š” arr[0]์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๊ฐ€ ๋˜์ฃ . ์ดํ›„ p[2], *(p + 2) ๋“ฑ์˜ ๋ฌธ๋ฒ•์„ ํ†ตํ•ด ๋ฐฐ์—ด์˜ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

printf("%d\n", arr[2]);   // 30
printf("%d\n", *(arr + 2)); // 30
printf("%d\n", p[2]);     // 30

์ฆ‰, arr์€ int 5๊ฐœ์งœ๋ฆฌ ๋ฉ์–ด๋ฆฌ์ด๋ฉด์„œ, ๋™์‹œ์— ๊ทธ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ฃผ์†Œ์ฒ˜๋Ÿผ๋„ ์“ฐ์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ scanf()์— ๋ฌธ์ž์—ด(char[])์„ ๋„˜๊ธธ ๋•Œ๋งŒ &๋ฅผ ์•ˆ ๋ถ™์ด๋Š” ์ด์œ ๊ฐ€ ๋ฐ”๋กœ ์ด๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜๊ฐ€ ๋ฐ”๋กœ ๊ทธ๋Ÿฌํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. (func()์˜ ์ธ์ž์— &๋ฅผ ๋ถ™์ด์ง€ ์•Š์•˜๋‹ค๋Š” ์ ์— ์ฃผ๋ชฉ)

#include <stdio.h>

void func(int* arr, int count) {
    for(int i=0; i<count; i++)
        arr[i] = arr[i]*3; // 3๋ฐฐ!
}

int main() {
    int arr[5] = {1, 2, 3};
    for (int i = 0; i < 5; i++) printf("%d ", arr[i]); // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 1, 2, 3
    func(arr, 5);                                      // &arr์ด ์•„๋‹ˆ๋ผ arr์„ ๋„ฃ์Œ!
    for (int i = 0; i < 5; i++) printf("%d ", arr[i]); // ์ถœ๋ ฅ ๊ฒฐ๊ณผ: 3, 6, 9
    return 0;
}

์ฃผ์˜์‚ฌํ•ญ

๋ฐฐ์—ด ๋ณ€์ˆ˜์™€ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ ์™„์ „ํžˆ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ด์ฃผ์„ธ์š”.

int arr[5];
int *p = arr;

printf("%zu\n", sizeof(arr)); // 20 (int 4๋ฐ”์ดํŠธ × 5๊ฐœ)
printf("%zu\n", sizeof(p));   // 8  (64๋น„ํŠธ ํฌ์ธํ„ฐ์˜ ํฌ๊ธฐ)

์ถœ๋ ฅ๋˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•์ด ๊ฑฐ์˜ ๋น„์Šทํ•ด๋„ ๊ฒฐ๊ตญ arr๊ณผ p๋Š” ๋ณ„๊ฐœ์˜ ์ž๋ฃŒํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.


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 }
};

์•„๋ž˜์™€ ๊ฐ™์ด ์„ ์–ธํ•˜๋ฉด, 3๊ฐœ ์—ด์„ ๋‹ด๋Š” (= int[3]์„ ๋‹ด๋Š”) 1๊ฐœ ํ–‰์งœ๋ฆฌ ํฌ์ธํ„ฐ p๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๊ด„ํ˜ธ๊ฐ€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐฐ์—ด์˜ ์„ ์–ธ์ด `int arr[10];` ๊ฐ™์€ ์‹์ด๊ณ , ๋ฐฐ์—ด์˜ ํฌ์ธํ„ฐ์˜ ์„ ์–ธ์€ ๋ณ„์ด ์ค‘๊ฐ„์— ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋Š”๋ฐ, ๊ด„ํ˜ธ๋ฅผ `int (* p) [10];`์™€ ๊ฐ™์ด ๋ฌถ์–ด์•ผ๋งŒ ์ •์ƒ์ ์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค.

int (*p)[3];
p = arr;
/* "3๊ฐœ์˜ int๋กœ ๊ตฌ์„ฑ๋œ ๋ฐฐ์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ"๋ฅผ ์„ ์–ธ, arr์˜ ๋งจ ์•ž ์ฃผ์†Œ๋ฅผ ๋Œ€์ž….
    ์ฆ‰,
    โ˜ž p์˜ ํƒ€์ž…์€ "ํฌ์ธํ„ฐ"
    โ˜ž *p์˜ ํƒ€์ž…์€ "int[3]"
    โ˜ž p[i]๋Š” i๋ฒˆ์งธ ํ–‰(๋ฐฐ์—ด)
    โ˜ž p[i][j]๋Š” ๊ทธ ํ–‰์˜ j๋ฒˆ์งธ ์›์†Œ
*/

๋‹ค์ฐจ์› ๋ฐฐ์—ด๊ณผ ๋‹ค์ค‘ ํฌ์ธํ„ฐ

ํ•œํŽธ, ๋‹ค์ฐจ์› ๋ฐฐ์—ด์„ ๋‹ค์ค‘ ํฌ์ธํ„ฐ๋กœ ์ ‘๊ทผํ•  ์ˆ˜๋Š” ์—†์„๊นŒ์š”? ๋จผ์ € ๋‹จ์ผ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•œ ์ •์ƒ์ ์ธ ์˜ˆ์‹œ๋ถ€ํ„ฐ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

// ์ •์ƒ์ ์ธ ์˜ˆ์‹œ
#include <stdio.h>

void printMatrix3D(int (*matrix)[3][4], int depth, int rows, int cols) {
    for (int k = 0; k < depth; k++) {
        printf("Depth %d:\n", k);
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++)
                printf("%3d ", matrix[k][i][j]);
            printf("\n");
        }
        printf("\n");
    }
}

void modifyMatrix3D(int (*matrix)[3][4], int depth, int rows, int cols) {
    for (int k = 0; k < depth; k++) {
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++)
                matrix[k][i][j] = matrix[k][i][j]*10; // 10๋ฐฐ!
        }
    }
}

int main() {
    int myArray[2][3][4] = {{
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12}
        },{ {13, 14, 15, 16},
            {17, 18, 19, 20},
            {21, 22, 23, 24}
        }
    };

    printf("์ˆ˜์ • ์ „:\n");
    printMatrix3D(myArray, 2, 3, 4);

    printf("modifyMatrix3D๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค...\n");
    modifyMatrix3D(myArray, 2, 3, 4);
    printf("modifyMatrix3D ์™„๋ฃŒ!\n");

    printf("\n์ˆ˜์ • ํ›„:\n");
    printMatrix3D(myArray, 2, 3, 4);

    return 0;
}

์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์œ„ ์ฝ”๋“œ์˜ modify ๋ฐ print ํ•จ์ˆ˜๋“ค์˜ ์ธ์ž๋“ค์„, ๊ทธ๋ƒฅ void printMatrix3D(int (**matrix)[4], ...๋‚˜ void printMatrix3D(int ***matrix, ...์ฒ˜๋Ÿผ ๋‹ค์ค‘ ํฌ์ธํ„ฐ๋กœ ๋ฐ›์œผ๋ฉด ์•ˆ๋ ๊นŒ ์‹ถ์œผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๋ก ์ ์œผ๋กœ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํฌ์ธํ„ฐ ์˜คํ”„์…‹ ๊ณ„์‚ฐ(+,-)๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์–ต์ง€๋กœ ๋‹ค์ค‘ ํฌ์ธํ„ฐ ์จ๋ณด๊ธฐ

// ์ž˜๋ชป๋œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค!!
#include <stdio.h>

// ์–ต์ง€๋กœ ***๋ฅผ ์‚ฌ์šฉ
void modifyMatrix3D(int ***matrix, int depth, int rows, int cols) {
    for (int k = 0; k < depth; k++) {
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++)
                matrix[k][i][j] *= 10; // 10๋ฐฐ
        }
    }
}

// ์–ต์ง€๋กœ ***๋ฅผ ์‚ฌ์šฉ
void printMatrix3D(int ***matrix, int depth, int rows, int cols) {
    for (int k = 0; k < depth; k++) {
        printf("Depth %d:\n", k);
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < cols; j++)
                printf("%3d ", matrix[k][i][j]);
            printf("\n");
        }
        printf("\n");
    }
}

int main() {
    int myArray[2][3][4] = {{
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12}
        },{ {13, 14, 15, 16},
            {17, 18, 19, 20},
            {21, 22, 23, 24}
        }
    };

    // ์–ต์ง€๋กœ int***๋กœ ์บ์ŠคํŒ…
    int ***p = (int ***) myArray;

    printf("์ˆ˜์ • ์ „:\n");
    printMatrix3D(p, 2, 3, 4);

    printf("modifyMatrix3D๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค...\n");
    modifyMatrix3D(p, 2, 3, 4);
    printf("modifyMatrix3D ์™„๋ฃŒ!\n");

    printf("\n์ˆ˜์ • ํ›„:\n");
    printMatrix3D(p, 2, 3, 4);

    return 0;
}

์œ„๋Š” ์–ต์ง€๋กœ ๋‹ค์ค‘ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•˜๋Š” ์ž˜๋ชป๋œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, printMatrix3D()์˜ ์‚ผ์ค‘ํฌ์ธํ„ฐ matrix์— ๋Œ€ํ•˜์—ฌ, matrix[k][i][j]๋Š” *(*(*(matrix+k)+i)+j)๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. k=0, i=0, j=0, matrix[0][0][0]=1์ด๋ผ ์น  ๋•Œ, ์ด๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ํ’€์–ด๋‚˜๊ฐ€๋ด…์‹œ๋‹ค.

  • ๋จผ์ € matrix+0, ์ฆ‰, 1์ด๋ผ๋Š” ๊ฐ’์ด ๋‚˜์˜ต๋‹ˆ๋‹ค. ์‹์€ *(*(*(1)+i)+j)๋กœ ํ’€๋ฆฝ๋‹ˆ๋‹ค.
  • *(1)์ด๋ž€, 0x00000001์ด๋ผ๋Š” ์ฃผ์†Œ์— ๋“  ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค(32๋น„ํŠธ ์‹œ์Šคํ…œ ๊ธฐ์ค€). 0x00000001์—๋Š” ๋ฌด์—‡์ด ๋“ค์—ˆ์„๊นŒ์š”?
  • ์•„๋ฌดํŠผ *(*(*(1)+i)+j) = *(*(0x00000001์— ๋“  ์“ฐ๋ ˆ๊ธฐ๊ฐ’+i)+j) ๊ฐ™์€ ์‹์œผ๋กœ ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ๋˜ ํ’€๋ฉด ๋˜ ์–ด๋– ํ•œ ์“ฐ๋ ˆ๊ธฐ๊ฐ’์ด ๋‚˜์˜ค๊ณ , ์ด๋ฅผ ํฌ์ธํ„ฐ๋กœ ํ•ด์„ํ•˜์—ฌ ์ฐธ์กฐํ•˜๊ณ , ๋˜ ์“ฐ๋ ˆ๊ธฐ๊ฐ’์ด ๋‚˜์˜ค๊ณ , ๋˜ ์ฐธ์กฐํ•˜๊ณ , ...

 

์ด๋Ÿฐ ์‹์œผ๋กœ ์ธ๊ฐ„์ด ์˜๋„ํ•œ ๋ฐ”์™€๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— int[2][3][4]๊ฐ™์€ ๋‹ค์ฐจ์› ๋ฐฐ์—ด์€ ๋ฐ˜๋“œ์‹œ ์ •ํ™•ํžˆ ์ผ์น˜ํ•˜๋Š” ํฌ์ธํ„ฐ ํƒ€์ž…(์˜ˆ: int (*)[3][4])์œผ๋กœ ๋ฐ›์•„์•ผ๋งŒ ๊ทธ์— ๋งž๋Š” ์˜คํ”„์…‹ ๊ณ„์‚ฐ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ ์œ„์™€ ๊ฐ™์ด ์˜ค๋™์ž‘ ๋˜๋Š” ์„ธ๊ทธ๋ฉ˜ํ…Œ์ด์…˜ ์˜ค๋ฅ˜(segmentation fault)๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 

์ฐธ๊ณ ๋กœ, ์œ„ ์ž˜๋ชป๋œ ์˜ˆ์‹œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค (์šฐ๋ถ„ํˆฌ).

์•„๋ž˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ๊ฐ€ ์—†๋Š” MS-DOS์—์„œ ๋™์ผ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค. ์™„์ „ํžˆ ์—‰๋šฑํ•œ ๊ฐ’์ด ๋‚˜์˜ด์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.