
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 |
์ธํธ๋ก
ํ๋ก๊ทธ๋๋ฐ์ ์ฒ์ ์ ํ๋ฉด “๋ณ์(์ ๊ทธ๋ฆผ์ โ )”๋ ์ต์ํ์ง๋ง, “ํฌ์ธํฐ(์ ๊ทธ๋ฆผ์ โก)”๋ ๊ฐ๋ ์ ๋ฏ์ค๊ณ ์ด๋ ต๊ฒ ๋๊ปด์ง๋๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ์ค, ํฌ์ธํฐ ๊ฐ๋ ์์ฒด๋ ์ด๋ ค์ธ ๊ฒ ์์ต๋๋ค. ํฌ์ธํฐ๋ “๋ฉ๋ชจ๋ฆฌ์ ํน์ ์ฃผ์๋ฅผ ์ ์ฅํ ๋ณ์”์ ๋ถ๊ณผํ๊ฑฐ๋ ์. ๋ฌธ๋ฒ์ ์ผ๋ก ์ข ํท๊ฐ๋ฆฌ๊ฒ ๋์ด ์์ ๋ฟ์ ๋๋ค (์ด๋ฒ ํฌ์ธํฐ ์๋ฆฌ์ฆ ์ ๋ฆฌํ๋ฉด์ ๋๋ ๊ฐ์ธ์ ์ธ ๊ฐ์์ ๋๋ค).
ํฌ์ธํฐ๊ฐ ๋ฌด์์ธ์ง, ํฌ์ธํฐ๋ฅผ ์/์ธ์ ์ฐ๋์ง, ํฌ์ธํฐ๋ฅผ ์ด๋ป๊ฒ ์ฐ๋์ง. ์ด๋ฒ ํฌ์คํธ์์๋ ํฌ์ธํฐ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ด ๋๋ ๊ฐ๋ ์ ํ๋์ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
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. ํฌ์ธํฐ์ ๋ฐฐ์ด์ ๊ด๊ณ
- ๊ด๋ จ ํฌ์คํธ๋ฅผ ์ฐธ์กฐํ์ค ์ ์์ต๋๋ค. ๋ฐฐ์ด๋ช ์ ๊ณง ์ฒซ ๋ฒ์งธ ์์์ ์ฃผ์๋ก ํด์๋ฉ๋๋ค.
int arr[5];
→arr
๋&arr[0]
์ ๋์ผํ ๊ฐ- ๋ฐฐ์ด ํ์:
arr[i]
๋*(arr + i)
์ ๋์ผ
char str[] = "HELLO";
char *p = str; // &str[0]
for (int i = 0; p[i] != '\0'; i++) {
putchar(*(p + i)); // p[i]
}
์์ฝ & ๊ฒฐ๋ก
- ํฌ์ธํฐ = ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ด๋ ๋ณ์
- ํฌ์ธํฐ๋ฅผ ์ ์ฐ๋๊ณ ? ํจ์ ์ธ์ ์ ๋ฌ ๋ฐฉ์ ๋๋ฌธ
- call-by-value: ๊ฐ ๋ณต์ฌ → ์๋ณธ ์์ ๋ถ๊ฐ
- call-by-reference: ์ฃผ์๊ฐ์ ๋ณต์ฌ → ํฌ์ธํฐ๋ฅผ ํตํด ์๋ณธ์ ์ฃผ์๋ก ์ ๊ทผ, ๊ณ ๋ก ์๋ณธ์ ์์ ๊ฐ๋ฅ
- ์ ์ธ: type *p;
- ์ฃผ์ ์ฐ์ฐ์ &: ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ตฌํจ
- ์ญ์ฐธ์กฐ *: ๊ฐ๋ฆฌํค๋ ์์น์ ๊ฐ ์ฝ๊ธฐ/์ฐ๊ธฐ
- ํฌ์ธํฐ ์ฐ์ : ํ์ ํฌ๊ธฐ๋งํผ ์ด๋ (p + 1)
- ๋ฐฐ์ด ์ด๋ฆ์ ํฌ์ธํฐ์ฒ๋ผ ๋์ (arr์ ์ฌ์ค์ &arr[0]์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ โ ๊ด๋ จ ํฌ์คํธ ์ฐธ์กฐ)
- ํญ์ ์ด๊ธฐํ ๋ฐ NULL ์ฒดํฌ๋ก ์์ ํ๊ฒ ์ฌ์ฉํ๊ธฐ
ํฌ์ธํฐ๋ ์ฒ์์ ๋ณต์กํด ๋ณด์ฌ๋, ๊ฒฐ๊ตญ “๋ฉ๋ชจ๋ฆฌ์์ ์ฃผ์๋ฅผ ๋ณ์์ ๋ด๊ณ , ๊ทธ ์ฃผ์์ ๊ฐ์ ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ์ํ ๋๊ตฌ”๋ผ๋ ์ ๋ง ๊ธฐ์ตํ๋ฉด ๋ฉ๋๋ค. ์ด ๊ฐ๋ ์ ํํํ ๋ค์ง๊ณ ๋๋ฉด, ํจ์๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต์ , ๋์ ํ ๋น, ์๋ฃ๊ตฌ์กฐ ๋ฑ C์ธ์ด๋ก ๋ฌด์์ ์ง๋๋ผ๋ ๋๋ ต์ง ์์ต๋๋ค.
'IT > ์ปดํจํ ์ ์ฌ๊ณ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ ๋-๋ธ๋ ํธ๋ฆฌ (Red-Black Tree) (1) | 2025.04.18 |
---|---|
C์ธ์ด์ ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ (0) | 2025.04.17 |
C์ธ์ด์ ํฌ์ธํฐ ์ดํด: ์๋ฃํ์ผ๋ก์์ *์ ์ญ์ฐธ์กฐ ์ฐ์ฐ์๋ก์์ * (2) | 2025.04.14 |
C์ธ์ด์ ๋ค์ค ํฌ์ธํฐ (0) | 2025.04.13 |
์ด๋ถ ํ์๊ณผ Python์ bisect_left (0) | 2025.03.27 |
Python ์ปดํ๋ฆฌํจ์ ๋ฐ ํํ์ ์ ๋ฆฌ (0) | 2025.03.27 |
[์คํฌ๋ฉ] CS:APP ๋นํธ์ฐ์ฐ ๊ณผ์ bits.c ๋ต์ (0) | 2016.11.06 |
์๋ ํ์ธ์.
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!