๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐ŸŽ› Others.../- c & python & android

[C ์–ธ์–ด] ํฌ์ธํ„ฐ๋กœ 2์ฐจ์› ๋ฐฐ์—ด ๋‹ค๋ฃจ๊ธฐ (์ฃผ์†Œ ์ ‘๊ทผ ๋ฐ ์›์†Œ ๊ฐ’ ์ ‘๊ทผ)

by Wonit 2021. 7. 3.

 

2์ฐจ์› ๋ฐฐ์—ด์˜ ํ˜•ํƒœ

 

์šฐ๋ฆฌ๊ฐ€ 2์ฐจ์› ๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ์— ๋Œ€ํ•œ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 2์ฐจ์› ๋ฐฐ์—ด์ด ๋ฉ”๋ชจ๋ฆฌ์— ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค.

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฐ์—ด์ด ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

 

int arr[3][2] = {
    {11, 22},
    {33, 44},
    {55, 66},
};

 

๊ทธ๋Ÿผ ๋ฉ”๋ชจ๋ฆฌ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ทธ๋ฆผ์„ ๋งŽ์ด ๋ด ์™”๋‹ค

 

 

ํ•˜์ง€๋งŒ ์ •ํ™•์ด ๋ง ํ•œ๋‹ค๋ฉด, ์ด ๊ทธ๋ฆผ์€ ์กฐ๊ธˆ ์ด์ƒํ•˜๋‹ค.

 

2์ฐจ์› ๋ฐฐ์—ด์ด๋ผ ์šฐ๋ฆฌ๊ฐ€ ๋ณด๊ธฐ ์‰ฝ๊ฒŒ ๊ตฌ๋ถ„ํ•ด๋†“์€ ๊ฒƒ์ผ ๋ฟ์ด์ง€ ์ €๋ ‡๊ฒŒ 2์ฐจ์›์œผ๋กœ ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

๋ฉ”๋ชจ๋ฆฌ๋Š” ์—ฐ์†์ ์ธ ํŠน์„ฑ ๋•๋ถ„์— 1์ฐจ์›์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ๋” ์˜ฌ๋ฐ”๋ฅด๋‹ค

 

๊ทธ๋Ÿผ ๋” ์˜ฌ๋ฐ”๋ฅธ ๊ตฌ์กฐ๋ฅผ ๊ทธ๋ ค๋ณด์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

 

์ด๋ ‡๊ฒŒ ๋จผ์ € ๋จธ๋ฆฌ์— ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํฌ์ธํ„ฐ์™€ 2์ฐจ์› ๋ฐฐ์—ด์˜ ์ƒ๊ด€๊ด€๊ณ„์— ๋Œ€ํ•ด์„œ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

2์ฐจ์› ๋ฐฐ์—ด์€ ์—ฐ์†์ ์ธ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋œ๋‹ค๊ณ  ํ•ด์„œ 1์ฐจ์› ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์ผ์—ด๋กœ ๋ณด์—ฌ์คฌ์ง€๋งŒ ์•„๋ž˜์— ๋‚˜์˜ฌ ๊ทธ๋ฆผ์€ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด์„œ 2์ฐจ์› ๊ตฌ์กฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

2์ฐจ์› ๋ฐฐ์—ด์˜ ํฌ์ธํ„ฐ

 

ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์— 2์ฐจ์› ๋ฐฐ์—ด์„ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” int (*pointer)[ํ–‰์˜ ์ˆ˜]; ํ˜•ํƒœ๋กœ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

๋ฐ”๋กœ ์ฝ”๋“œ๋กœ ํ™•์ธํ•ด๋ณด์ž

 

#include <stdio.h>

int main() {

    int arr[3][2] = {
            {11, 22},
            {33, 44},
            {55, 66},
    };

    int (*pointer)[2]; // ํ–‰์„ 2๋กœ ํ•˜๋Š” 2์ฐจ์› ๋ฐฐ์—ด ํฌ์ธํ„ฐ ํ•˜๋‚˜ ์ƒ์„ฑ

    pointer = arr;

    return 0;
}

 

์—ฌ๊ธฐ์„œ ๊ด„ํ˜ธ์˜ ์—ญํ• ์ด ๋งŽ์ด ์ค‘์š”ํ•˜๋‹ค.

 

๋งŒ์•ฝ ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•˜๊ณ  *pointer[2] ๋ผ๊ณ  ํ•˜๋ฉด ์ด๋Š” ํฌ์ธํ„ฐ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๊ฒ ๋‹ค๋Š” ๋œป์œผ๋กœ, int ํ˜• ํฌ์ธํ„ฐ 2๊ฐœ๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ์ €์žฅ๋˜๋Š” ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋˜๊ฒŒ ๋œ๋‹ค.

 

1์ฐจ์› ๋ฐฐ์—ด๋กœ ์ƒ๊ฐํ•˜๊ธฐ

 

2์ฐจ์› ๋ฐฐ์—ด์„ ํฌ์ธํ„ฐ๋กœ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ ์šฐ์„  1์ฐจ์› ๋ฐฐ์—ด์ด ์—ฐ์†์ ์œผ๋กœ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž

 

๊ทธ๋Ÿผ ์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” ๋ฐฐ์—ด size ๊ฐ€ 2์ธ ๋ฐฐ์—ด 3๊ฐœ๊ฐ€ ์—ฐ์†์ ์œผ๋กœ ์กด์žฌํ•œ๋‹ค๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ทธ๋Ÿผ 2์ฐจ์› ๋ฐฐ์—ด์—์„œ๋„ ์—ญ์‹œ 1์ฐจ์› ๋ฐฐ์—ด์˜ ๊ฐœ๋…์„ ํ•จ๊ป˜ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2์ฐจ์› ๋ฐฐ์—ด ํฌ์ธํ„ฐ๋กœ ๋ฐฐ์—ด ์ฃผ์†Œ ์ ‘๊ทผํ•˜๊ธฐ

 

๊ฒฐ๊ตญ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ ์ด๋“ค ๊ฐ๊ฐ์˜ ์ฃผ์†Œ๋กœ ์ ‘๊ทผํ•œ๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค

 

  • arr[0] : *pointer
    • pointer ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ
  • arr[1] : *(pointer + 1)
    • pointer ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ + 4 byte
  • arr[2] : *(pointer + 2)
    • pointer ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ + 8 byte

 

 

๊ทธ๋Ÿผ ์ด ํŠน์„ฑ์„ ์ด์šฉํ•ด์„œ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์›์†Œ์˜ ์ฃผ์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ด๋ ‡๊ฒŒ ํฌ์ธํ„ฐ์™€ ์ •์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ byte ๋ฅผ ์˜ฎ๊ฒจ ๋ชจ๋“  ์›์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๊ฒŒ ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

 

arr[1][1] == *(pointer + 1) + 1 ์„ ์ข€ ๋” ๋ถ„์„ํ•ด๋ณด์ž

 

 

์ด๋Š” pointer ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ (arr)์— 4 byte ๋ฅผ ๋”ํ•˜๊ณ  +1 ๋กœ ์ธํ•ด ๋˜ 4byte ๋ฅผ ๋”ํ•œ ์ฃผ์†Œ๊ฐ’์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋ฅผ ๋ฐ˜์ฆ๋ฌธ์„ ํ†ตํ•ด์„œ ์ฆ๋ช…ํ•ด๋ณด์ž๋ฉด,

 

#include <assert.h>

int main() {

    int arr[3][2] = {
            {11, 22},
            {33, 44},
            {55, 66},
    };

    int (*pointer)[2] = arr;

    assert(&arr[0][0] == *pointer);
    assert(&arr[0][1] == *pointer + 1);

    assert(&arr[1][0] == *(pointer + 1));
    assert(&arr[1][1] == *(pointer + 1) + 1);

    assert(&arr[2][0] == *(pointer + 2));
    assert(&arr[2][1] == *(pointer + 2) + 1);

    return 0;
}

 

2์ฐจ์› ๋ฐฐ์—ด ํฌ์ธํ„ฐ๋กœ ๋ฐฐ์—ด ์›์†Œ์˜ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

 

์ด์ œ ๋ชจ๋“  ์›์†Œ์˜ ์ฃผ์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค! ๊ทธ๋Ÿผ ์ฐธ์กฐ ์—ฐ์‚ฐ์„ ์ด์šฉํ•ด์„œ ์‹ค์ œ ๊ฐ’์„ ์ทจํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

#include <stdio.h>

int main() {
    int arr[3][2] = {
            {11, 22},
            {33, 44},
            {55, 66},
    };

    int (*pointer)[2] = arr;

    printf("%d\n", **pointer);
    printf("%d\n", *(*pointer + 1));

    printf("%d\n", *(*(pointer + 1) + 0)); // + 0 ์€ ์ƒ๋žต ๊ฐ€๋Šฅ
    printf("%d\n", *(*(pointer + 1) + 1));

    printf("%d\n", *(*(pointer + 2) + 0)); // + 0 ์€ ์ƒ๋žต ๊ฐ€๋Šฅ
    printf("%d\n", *(*(pointer + 2) + 1));

    return 0;
}

๋Œ“๊ธ€