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

C์–ธ์–ด์˜ ํฌ์ธํ„ฐ (๊ธฐ์ดˆ)

Unused 2025. 4. 17. 15:52

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://learningc.org/chapters/chapter06-pointers/what-are-pointers

์ธํŠธ๋กœ

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ฒ˜์Œ ์ ‘ํ•˜๋ฉด “๋ณ€์ˆ˜(์œ„ ๊ทธ๋ฆผ์˜ โ‘ )”๋Š” ์ต์ˆ™ํ•˜์ง€๋งŒ, “ํฌ์ธํ„ฐ(์œ„ ๊ทธ๋ฆผ์˜ โ‘ก)”๋ž€ ๊ฐœ๋…์€ ๋‚ฏ์„ค๊ณ  ์–ด๋ ต๊ฒŒ ๋А๊ปด์ง‘๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์‹ค, ํฌ์ธํ„ฐ ๊ฐœ๋… ์ž์ฒด๋Š” ์–ด๋ ค์šธ ๊ฒŒ ์—†์Šต๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๋Š” “๋ฉ”๋ชจ๋ฆฌ์˜ ํŠน์ • ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•œ ๋ณ€์ˆ˜”์— ๋ถˆ๊ณผํ•˜๊ฑฐ๋“ ์š”. ๋ฌธ๋ฒ•์ ์œผ๋กœ ์ข€ ํ—ท๊ฐˆ๋ฆฌ๊ฒŒ ๋˜์–ด ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค (์ด๋ฒˆ ํฌ์ธํ„ฐ ์‹œ๋ฆฌ์ฆˆ ์ •๋ฆฌํ•˜๋ฉด์„œ ๋А๋‚€ ๊ฐœ์ธ์ ์ธ ๊ฐ์ƒ์ž…๋‹ˆ๋‹ค).

ํฌ์ธํ„ฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€, ํฌ์ธํ„ฐ๋ฅผ ์™œ/์–ธ์ œ ์“ฐ๋Š”์ง€, ํฌ์ธํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์“ฐ๋Š”์ง€. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ํฌ์ธํ„ฐ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๊ฐœ๋…์„ ํ•˜๋‚˜์”ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


1. ํฌ์ธํ„ฐ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

  • ํฌ์ธํ„ฐ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋‹ด๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋œ ๊ณต๊ฐ„์˜ ‘์œ„์น˜’๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ๋ณ€์ˆ˜๋Š” ๊ฐ’(๋ฐ์ดํ„ฐ)์„ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ๋ž€ ํ”ํžˆ RAM์ด๋ผ ๋ถ€๋ฅด๋Š” ๊ณณ์œผ๋กœ, ๋ฒˆํ˜ธ(์ฃผ์†Œ)๊ฐ€ 1๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋งค๊ฒจ์ง‘๋‹ˆ๋‹ค. ๊ฐ€๋ น, 32๋น„ํŠธ ์‹œ์Šคํ…œ ๊ธฐ์ค€์œผ๋กœ 0x00000000๋ถ€ํ„ฐ 0xFFFFFFFF๊นŒ์ง€์ž…๋‹ˆ๋‹ค. (๊ด€๋ จ ๋ฌธ์„œ ์ฐธ์กฐ: CPU ๋ ˆ์ง€์Šคํ„ฐ ↔ ์บ์‹œ ↔ ๋ฉ”๋ชจ๋ฆฌ ↔ ์Šคํ† ๋ฆฌ์ง€์˜ ๊ฐœ๋…๐Ÿ”—, ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ๐Ÿ”—, ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ตฌ์กฐ๐Ÿ”—)
  • ๊ฐ€๋ น, int value = 10;๋ž€, “int ํƒ€์ž…์œผ๋กœ ํ•ด์„๋˜๋Š” value๋ฅผ ์„ ์–ธ, 4๋ฐ”์ดํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋‚ด๊ณ , ๊ฑฐ๊ธฐ์— 10์„ ์ €์žฅํ•œ๋‹ค”์ž…๋‹ˆ๋‹ค.
  • ํ•œํŽธ int *p = &value;๋Š”, “value๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ, p๋ผ๋Š” int ํฌ์ธํ„ฐ(int *)์— ์ €์žฅํ•œ๋‹ค”๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
int value = 10;   // value๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ 4๋ฐ”์ดํŠธ ๊ณต๊ฐ„์— 10 ์ €์žฅ
int *p = &value;  // p๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ value์˜ ์ฃผ์†Œ(์˜ˆ: 0xFFB2C4AC) ์ €์žฅ
  • p์— ๋“  ๊ฐ’์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ(์˜ˆ: 0xFFB2C4AC).
  • ์ด p๋„ ๊ฒฐ๊ตญ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด๊ธฐ์—, p๊ฐ€ ์ €์žฅ๋œ ์ฃผ์†Œ ๋˜ํ•œ ๋‹ค๋ฅธ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์— ๋‹ด์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒŒ ๋ฐ”๋กœ ๋‹ค์ค‘ ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค. (๊ด€๋ จ ํฌ์ŠคํŠธ ์ฐธ์กฐ)

2. ํฌ์ธํ„ฐ๋Š” ์™œ ์“ฐ๋Š”๊ฐ€? Call-by-Value vs. Call-by-Reference

ํฌ์ธํ„ฐ๋Š” ์™œ ์“ธ๊นŒ์š”? C์—์„œ ๋ชจ๋“  ํ•จ์ˆ˜ ์ธ์ž๋Š” ๋ณต์‚ฌ๋˜์–ด ๋„˜์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์›๋ณธ์ด ์•„๋‹Œ ๋ณต์‚ฌ๋ณธ์ด๊ธฐ์—, ํ•จ์ˆ˜์— ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์€ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ์œ„ ์ด๋ฏธ์ง€ ์ขŒ์ธก์ด ๋ฐ”๋กœ call-by-reference, ์šฐ์ธก์ด call-by-value์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋ฌธ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜ ์„ค๋ช…์„ ๋“œ๋ฆฌ๋ฏ€๋กœ ํ˜„์‹œ์ ์—์„œ๋Š” ํฌ์ธํ„ฐ๋ฅผ ์“ฐ๋Š” ์ด์œ ๋ฅผ ์ค‘์ ์ ์œผ๋กœ ํŒŒ์•…ํ•ด์ฃผ์‹œ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

2.1. Call-by-Value (๊ฐ’์„ ์ „๋‹ฌ)

void foo(int x) {
    x = 999;
}

int main() {
    int a = 123;
    foo(a);
    printf("%d\n", a);  // 123
}
  • a์˜ ๊ฐ’์ด ํ•จ์ˆ˜์— ๋ณต์‚ฌ๋˜์–ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
  • ์ฆ‰, main()์˜ int a์™€ foo()์˜ int x๋Š” ์„œ๋กœ ๋ณ„๊ฐœ์˜ ๋ฌผ๊ฑด์ž…๋‹ˆ๋‹ค. ๋‹จ์ง€ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.
  • foo()๋Š” 123์„ ๋ณต์‚ฌ๋ฐ›์€ ๊ฒƒ์ด๊ณ , ์ด๋ฅผ foo() ์•ˆ์—์„œ x = 999;๋ผ๊ณ  ๋ฐ”๊ฟ”๋„, main()์˜ a์—๋Š” ์˜ํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ์š”์ปจ๋Œ€ ์›๋ณธ์€ ๊ทธ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค.

2.2. Call-by-Reference (๊ฐ’์ด ์œ„์น˜ํ•œ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌ)

void foo(int *x) {
    *x = 999;
}

int main() {
    int a = 123;
    foo(&a);
    printf("%d\n", a);  // 999
}
  • a์˜ ์ฃผ์†Œ๊ฐ’(&a)์ด ํ•จ์ˆ˜์— ๋ณต์‚ฌ๋˜์–ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ด๊ฑธ ๋ฐ›์€ ํ•จ์ˆ˜์—์„œ๋Š” ์ด๋ฅผ ์—ญ์ฐธ์กฐ ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณต์‚ฌ ์ž์ฒด๋Š” call-by-value์™€ ๊ฐ™์ง€๋งŒ, ์—ฌ๊ธฐ์„œ ๋ณต์‚ฌ๋˜๋Š” ๊ฒƒ์€ ์ฃผ์†Œ๊ฐ’์ž…๋‹ˆ๋‹ค. 
  • ์ฆ‰, foo() ์•ˆ์—์„œ *x = 999;๋Š”, main()์˜ a๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์œ„์น˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์ ‘๊ทผํ•ด์„œ ์›๋ณธ์˜ a๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ฒฐ๊ณผ๋กœ, ์›๋ณธ์ด ๋ฐ”๋€๋‹ˆ๋‹ค.

2.3. ์ •๋ฆฌํ•˜๊ธฐ

  • Call-by-Value
    • ์ˆซ์ž ๋“ฑ ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ์˜ ๋น ๋ฅธ ์ „๋‹ฌ
    • ๊ฐ’์„ ์ฝ๊ธฐ๋งŒ ํ•  ๋ฟ ์›๋ณธ์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๋Š” ์—†์„ ๋•Œ
  • Call-by-Reference
    • ๋ฌธ์ž์—ด, ๋ฐฐ์—ด, ๊ตฌ์กฐ์ฒด๋ฅผ ๋น„๋กฏํ•œ ํฐ ๋ฐ์ดํ„ฐ์˜ ํšจ์œจ์ ์ธ ์ „๋‹ฌ
    • ์›๋ณธ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๋•Œ

๊ฒฐ๊ตญ ์ด ์ฐจ์ด์ž…๋‹ˆ๋‹ค. foo(12345);์™€ foo(0xABCDABCD);. ํ”ผํ˜ธ์ถœ ํ•จ์ˆ˜์˜ ์ž…์žฅ์—์„œ ๋ณด๋ฉด, ์ „์ž์˜ ๊ฒฝ์šฐ 12345๋ผ๋Š” ์ˆซ์ž๋ฅผ ์ „๋‹ฌ๋ฐ›์•˜๊ธฐ์— ๊ทธ๊ฑธ ์ž๊ธฐ๊ฐ€ 54321๋กœ ๊ณ ์น˜๋“  0์œผ๋กœ ๊ณ ์น˜๋“  ๊ทธ ํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๋Š” ์ˆœ๊ฐ„ ์•„๋ฌด๋Ÿฐ ์˜๋ฏธ๊ฐ€ ์—†์–ด์ง‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ›„์ž์˜ ๊ฒฝ์šฐ 0xABCDABCD๋ผ๋Š” ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌ๋ฐ›์•˜๊ธฐ์— ํ”ผํ˜ธ์ถœ ํ•จ์ˆ˜๊ฐ€ 0xABCDABCD๋ผ๋Š” ์ฃผ์†Œ๋กœ ์ง์ ‘ ๊ฐ€์„œ ๊ฐ’์„ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


2.4. ์‚ฌ์šฉ ์˜ˆ์‹œ: swap ํ•จ์ˆ˜

Call-by-Value๋กœ๋Š” ์ž‘๋™ ์•ˆ ํ•จ

void swap(int a, int b) {
    int tmp = a;
    a = b;
    b = tmp;
}
int x = 10, y = 20;
swap(x, y); // ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์—ฌ๊ธฐ์˜ x, y๋Š” ๊ทธ๋Œ€๋กœ

Call-by-Reference๋กœ๋Š” ์ž‘๋™ํ•จ

void swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}
int x = 10, y = 20;
swap(&x, &y); // ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚˜์˜ค๊ณ  ๋‚˜์„œ๋„ x, y ๊ฐ’์ด ๋ฐ”๋€ ์ฑ„๋กœ ์œ ์ง€

3. ์„ ์–ธ/์ดˆ๊ธฐํ™” ๋ฌธ๋ฒ•

๋ฌธ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

type *์ด๋ฆ„;    // ์„ ์–ธ๋งŒ ํ–ˆ์Œ: ์“ฐ๋ ˆ๊ธฐ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•จ.
type *์ด๋ฆ„ = NULL;       // ์ดˆ๊ธฐํ™” 1: NULL ํฌ์ธํ„ฐ๋กœ ์‹œ์ž‘
type *์ด๋ฆ„ = &๋ณ€์ˆ˜;      // ์ดˆ๊ธฐํ™” 2: ์‹ค์ œ ๋ณ€์ˆ˜ ์ฃผ์†Œ๋ฅผ ๋Œ€์ž…
  • type *๋Š” “type ํ˜• ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•  ํฌ์ธํ„ฐ”๋ผ๋Š” ๋œป. ์˜ˆ์‹œ) int *, char *, float *, void *, ...
  • ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

int myValue = 12345;

int *myPtr1;    // ์„ ์–ธ๋งŒ ํ–ˆ์Œ: ์“ฐ๋ ˆ๊ธฐ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•จ!
int *myPtr2 = NULL;          // ์ดˆ๊ธฐํ™” 1: NULL ํฌ์ธํ„ฐ๋กœ ์‹œ์ž‘
int *myPtr3 = &myValue;      // ์ดˆ๊ธฐํ™” 2: ์‹ค์ œ ๋ณ€์ˆ˜ ์ฃผ์†Œ๋ฅผ ๋Œ€์ž…

4. ์—ญ์ฐธ์กฐ ์—ฐ์‚ฐ์ž *

  • ์ฃผ์˜! ์œ„ '์„ ์–ธ/์ดˆ๊ธฐํ™” ๋ฌธ๋ฒ•'์˜ *์™€๋Š” ๋‹ค๋ฅธ ์—ญํ• ์ž…๋‹ˆ๋‹ค. ๊ด€๋ จ ํฌ์ŠคํŠธ๋ฅผ ๊ผญ ์ฝ์–ด์ฃผ์„ธ์š”.
  • *ํฌ์ธํ„ฐ๋Š” “ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์“ด๋‹ค”๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • ์ฝ๊ธฐ: int y = *p;
  • ์“ฐ๊ธฐ: *p = 99;
int value = 10;
int *p = &value;

printf("before: %d\n", value);  // 10
*p = 20;                         // value์˜ ๋ฉ”๋ชจ๋ฆฌ์— 20 ์ €์žฅ
printf(" after: %d\n", value);  // 20

5. ์ฃผ์†Œ ์—ฐ์‚ฐ์ž &

  • &๋ณ€์ˆ˜๋Š” “๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ”๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • &value → value๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋†“์—ฌ ์žˆ๋Š” ์œ„์น˜(์˜ˆ: 0xFFB2C4AC)
int x = 42;
printf("x์˜ ์ฃผ์†Œ: %p\n", &x);

6. ํฌ์ธํ„ฐ ์‚ฐ์ˆ  ์—ฐ์‚ฐ

  • ๊ฐ™์€ +, -๋ฅผ ์“ฐ๋”๋ผ๋„ ํฌ์ธํ„ฐ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค! ํฌ์ธํ„ฐ๋Š” ๊ฐ€๋ฆฌํ‚ค๋Š” ํƒ€์ž…์˜ ํฌ๊ธฐ๋งŒํผ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
    • p๊ฐ€ ํฌ์ธํ„ฐ์ผ ๋•Œ, p+1์€ sizeof(type) ๋ฐ”์ดํŠธ๋งŒํผ ๋„˜์–ด๊ฐ
    • ์˜ˆ์‹œ 1: int *p; p+1์€ p์—์„œ 4๋ฐ”์ดํŠธ๋ฅผ ๋„˜์–ด๊ฐ„ ์ฃผ์†Œ (32๋น„ํŠธ int ๊ธฐ์ค€)
    • ์˜ˆ์‹œ 2: void *p; p+1์€ p์—์„œ 1๋ฐ”์ดํŠธ ๋„˜์–ด๊ฐ„ ์ฃผ์†Œ
    • ์˜ˆ์‹œ 3: int (*p)[7]; p+1์€โ€ฏp์—์„œ int[7]โ€ฏ(์ฆ‰,โ€ฏ7โ€ฏ×โ€ฏsizeof(int)โ€ฏ=โ€ฏ28๋ฐ”์ดํŠธ)๋ฅผ ๋„˜์–ด๊ฐ„ ์ฃผ์†Œ
    • ์˜ˆ์‹œ 4: int (*p)[7][5]; p+1์€โ€ฏp์—์„œ int[7][5]โ€ฏ(์ฆ‰,โ€ฏ7โ€ฏ×โ€ฏ5โ€ฏ×โ€ฏsizeof(int)โ€ฏ=โ€ฏ140โ€ฏ๋ฐ”์ดํŠธ)๋ฅผ ๋„˜์–ด๊ฐ„ ์ฃผ์†Œ
int arr[3] = {100, 200, 300};
int *p = arr;      // &arr[0]
printf("%d\n", *p);    // arr[0] → 100
p = p + 1;
printf("%d\n", *p);    // arr[1] → 200

7. NULL ํฌ์ธํ„ฐ์™€ ์•ˆ์ „ํ•œ ์‚ฌ์šฉ

  • NULL ํฌ์ธํ„ฐ: NULL ๋˜๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ํฌ์ธํ„ฐ
  • ์—ญ์ฐธ์กฐ ์ „์— ๋ฐ˜๋“œ์‹œ NULL ์ฒดํฌ!
int *p = NULL;
if (p != NULL) {
    printf("%d\n", *p);
} else {
    puts("ํฌ์ธํ„ฐ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!");
}

8. ํฌ์ธํ„ฐ์™€ ๋ฐฐ์—ด์˜ ๊ด€๊ณ„

char str[] = "HELLO";
char *p = str;      // &str[0]
for (int i = 0; p[i] != '\0'; i++) {
    putchar(*(p + i));  // p[i]
}

์š”์•ฝ & ๊ฒฐ๋ก 

  1. ํฌ์ธํ„ฐ = ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋‹ด๋Š” ๋ณ€์ˆ˜
  2. ํฌ์ธํ„ฐ๋ฅผ ์™œ ์“ฐ๋ƒ๊ณ ? ํ•จ์ˆ˜ ์ธ์ž ์ „๋‹ฌ ๋ฐฉ์‹ ๋•Œ๋ฌธ
    • call-by-value: ๊ฐ’ ๋ณต์‚ฌ → ์›๋ณธ ์ˆ˜์ • ๋ถˆ๊ฐ€
    • call-by-reference: ์ฃผ์†Œ๊ฐ’์„ ๋ณต์‚ฌ → ํฌ์ธํ„ฐ๋ฅผ ํ†ตํ•ด ์›๋ณธ์˜ ์ฃผ์†Œ๋กœ ์ ‘๊ทผ, ๊ณ ๋กœ ์›๋ณธ์„ ์ˆ˜์ • ๊ฐ€๋Šฅ
  3. ์„ ์–ธ: type *p;
  4. ์ฃผ์†Œ ์—ฐ์‚ฐ์ž &: ๋ณ€์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ตฌํ•จ
  5. ์—ญ์ฐธ์กฐ *: ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜์˜ ๊ฐ’ ์ฝ๊ธฐ/์“ฐ๊ธฐ
  6. ํฌ์ธํ„ฐ ์‚ฐ์ˆ : ํƒ€์ž… ํฌ๊ธฐ๋งŒํผ ์ด๋™ (p + 1)
  7. ๋ฐฐ์—ด ์ด๋ฆ„์€ ํฌ์ธํ„ฐ์ฒ˜๋Ÿผ ๋™์ž‘ (arr์€ ์‚ฌ์‹ค์ƒ &arr[0]์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ โ€• ๊ด€๋ จ ํฌ์ŠคํŠธ ์ฐธ์กฐ)
  8. ํ•ญ์ƒ ์ดˆ๊ธฐํ™” ๋ฐ NULL ์ฒดํฌ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ

ํฌ์ธํ„ฐ๋Š” ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฌธ๋ฒ•์ด ์ข€ ํ—ท๊ฐˆ๋ฆฌ์ง€๋งŒ์š”.

ํฌ์ธํ„ฐ๋Š” ์ฒ˜์Œ์—” ๋ณต์žกํ•ด ๋ณด์—ฌ๋„, ๊ฒฐ๊ตญ “๋ฉ”๋ชจ๋ฆฌ์ƒ์˜ ์ฃผ์†Œ๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด๊ณ , ๊ทธ ์ฃผ์†Œ์˜ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์“ฐ๊ธฐ ์œ„ํ•œ ๋„๊ตฌ”๋ผ๋Š” ์ ๋งŒ ๊ธฐ์–ตํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฐœ๋…์„ ํƒ„ํƒ„ํžˆ ๋‹ค์ง€๊ณ  ๋‚˜๋ฉด, ํ•จ์ˆ˜๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ , ๋™์  ํ• ๋‹น, ์ž๋ฃŒ๊ตฌ์กฐ ๋“ฑ C์–ธ์–ด๋กœ ๋ฌด์—‡์„ ์งœ๋”๋ผ๋„ ๋‘๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค.