๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿคท๐Ÿผ‍โ™€๏ธ Etc.../- C, C++, Python, Android

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

by Wonit 2021. 7. 3.

 

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

 

ํฌ์ธํ„ฐ์™€ ๋ฐฐ์—ด์€ ๋งค์šฐ ๊ธด๋ฐ€ํ•œ ๊ด€๊ณ„๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๊ณ  ์—ฌ๋Ÿฌ ์„œ์  ๋ฐ ์ž๋ฃŒ์—์„œ ์ด์•ผ๊ธฐ ํ•œ๋‹ค.

 

์–ด๋–ค ๋ถ€๋ถ„์—์„œ๋Š” ๋ฐฐ์—ด์ด ํฌ์ธํ„ฐ๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ๋„ ํ•˜๊ณ  ํ˜น์€ ํฌ์ธํ„ฐ๊ฐ€ ๋ฐฐ์—ด์„ ๋Œ€์ฒดํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

๋ฐฐ์—ด์„ ๋ฐฐ์šธ ๋•Œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

๋ฐฐ์—ด์˜ ์ด๋ฆ„(๋ณ€์ˆ˜๋ช…)์€ ํ•ด๋‹น ๋ฐฐ์—ด์˜ ์ฃผ์†Œ์ž„๊ณผ ๋™์‹œ์— ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์˜ ์ฃผ์†Œ ๊ฐ’ ์ด๋‹ค!

 

์•ž์„  ์‹œ๊ฐ„์— ํฌ์ธํ„ฐ์—์„œ๋Š” ๋˜ ์ด๋Ÿฐ ๋‚ด์šฉ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์— ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ ์˜ค๋กœ์ง€ ์ฃผ์†Œ ๊ฐ’!

 

๊ทธ๋Ÿผ ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ• ๊นŒ?

 

#include <assert.h>

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

    int *pointer = arr;

    return 0;
}

 

๊ทธ๋ ‡๋‹ค ์œ„์˜ ์ฝ”๋“œ๋Š” ์ „ํ˜€ ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ์ฝ”๋“œ์ด๋ฉฐ ์ž˜ ๋™์ž‘ํ•  ๊ฒƒ์ด๋‹ค.

 

 

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

 

ํฌ์ธํ„ฐ๋กœ ๋ฐฐ์—ด ์š”์†Œ ์ ‘๊ทผํ•˜๊ธฐ

 

๋ฐฐ์—ด์—์„œ ํŠน์ • ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ฐ€์žฅ ํ”ํ•˜๋‹ค.

 

ํ•˜์ง€๋งŒ ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ํฌ์ธํ„ฐ์™€ ์ •์ˆ˜๋ฅผ ์ ์ ˆํžˆ ์กฐ์ž‘ํ•˜์—ฌ ์ ‘๊ทผ ํ•˜๋Š” ๋ฐฉ์‹๋„ ์กด์žฌํ•œ๋‹ค.

 

๊ทธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์•Œ์•„๋ณด์ž.

 

#include <stdio.h>

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

    int *pointer = arr;

    printf("%010x", pointer + 0);
    printf("%010x", pointer + 1);
    printf("%010x", pointer + 2);
    printf("%010x", pointer + 3);

    return 0;
}

 

์œ„์˜ ์ฝ”๋“œ์—์„œ pointer + 1 ์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ๋ฌด์—‡์ผ๊นŒ?

 

(pointer + ์ •์ˆ˜) ์˜ ์˜๋ฏธ

 

pointer ๋ณ€์ˆ˜์— ์ •์ˆ˜๋ฅผ ๋”ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…๋งŒํผ์˜ byte ๋ฅผ ๋”ํ•œ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ๋œ๋‹ค.

 

์ด ๋ง์€ ๋ฌด์—‡์ด๋ƒ?

 

์ฆ‰ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋Š” ์†Œ๋ฆฌ์ด๋‹ค.

 

  • pointer + 0
    • pointer ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ฃผ์†Œ ๊ฐ’์— 0byte ๋งŒํผ์„ ๋”ํ•œ ์ฃผ์†Œ
  • pointer + 1
    • pointer ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ฃผ์†Œ ๊ฐ’์— 4byte ๋งŒํผ์„ ๋”ํ•œ ์ฃผ์†Œ
  • pointer + 2
    • pointer ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ์ฃผ์†Œ ๊ฐ’์— 8byte ๋งŒํผ์„ ๋”ํ•œ ์ฃผ์†Œ

 

์™œ 4 ๋ฐ”์ดํŠธ์”ฉ ์ฆ๊ฐ€ํ• ๊นŒ?

 

์ด์œ ๋Š” ๋ฐ”๋กœ pointer ๋ณ€์ˆ˜๊ฐ€ ํ• ๋‹น๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด integer ํƒ€์ž…์ด๋ผ ๊ทธ๋ ‡๋‹ค.

 

๊ทธ๋Ÿผ ์œ„์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค

 

 

ํฌ์ธํ„ฐ๋กœ ์ ‘๊ทผํ•œ ๋ฐฐ์—ด ์š”์†Œ์˜ ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ

 

์ง€๋‚œ ์‹œ๊ฐ„์— ํฌ์ธํ„ฐ๋ฅผ ์ด์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ฐธ์กฐ ์—ฐ์‚ฐ์ž * ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค.

 

์ฐธ์กฐ ์—ฐ์‚ฐ์ž๊ฐ€ ๋งŒ์•ฝ ๋ณ€์ˆ˜๋ช… ์•ž์— ์‚ฌ์šฉ๋œ๋‹ค๋ฉด ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ ํ•œ๋‹ค๊ณ  ํ–ˆ์œผ๋‹ˆ ์šฐ๋ฆฌ๋Š” ์ฐธ์กฐ ์—ฐ์‚ฐ์ž๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ๊ฐ’์„ ์ทจํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

#include <stdio.h>

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

    int *pointer = arr;

    printf("%d", *pointer); // pointer ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” arr ์˜ ์ฃผ์†Œ์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์˜ ๊ฐ’์ธ 11 ์ด ์ถœ๋ ฅ๋จ

    return 0;
}

 

์šฐ๋ฆฌ๋Š” ์•ž์„œ์„œ (pointer + ์ •์ˆ˜) ์˜ ์˜๋ฏธ๋ฅผ ์ด์šฉํ•ด์„œ ๋ชจ๋“  ๋ฐฐ์—ด ์š”์†Œ์˜ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

์ฃผ์˜ํ•˜์ž

 

์šฐ๋ฆฌ๋Š” pointer + ์ •์ˆ˜ ๋ฅผ ์ด์šฉํ•ด์„œ ๋ชจ๋“  ๋ฐฐ์—ด ์š”์†Œ์˜ ๊ฐ’์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, pointer + ์ •์ˆ˜ ๊ฐ€ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌ๋˜์ง€ ์•Š์œผ๋ฉด!

 

์ฆ‰ ๊ด„ํ˜ธ๋กœ ์ ์ ˆํ•˜๊ฒŒ ๋ฌถ์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

*pointer + 1 ๊ณผ *(pointer + 1) ์€ ์•„์ฃผ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค๋Š” ์†Œ๋ฆฌ๋‹ค.

  • *pointer + 1
    • pointer ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์˜ ๊ฐ’์— ์ •์ˆ˜ 1์„ ๋”ํ•œ ๊ฐ’
  • *(pointer + 1)
    • pointer ๋ณ€์ˆ˜๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์—์„œ 4byte ๋งŒํผ ์ด๋™ํ•œ ์ฃผ์†Œ์— ์ €์žฅ๋œ ๊ฐ’

 

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์•ž์„œ ๋ฐฐ์šด (pointer + ์ •์ˆ˜)์˜ ๊ฐœ๋…๊ณผ * ์—ฐ์‚ฐ์ž์˜ ๊ฐœ๋…์„ ๋ชจ๋‘ ์ ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

#include <assert.h>

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

    int *pointer = arr;

    assert(arr[0] == *pointer);

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

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

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

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

    return 0;
}

๋Œ“๊ธ€