๊ฐ์ธ ๊ณต๋ถ ๊ณผ์ ์ ๊ธฐ๋กํฉ๋๋ค.
C์ธ์ด๋ก ํฌ์ธํฐ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ดํดํ๊ธฐ!
ํฌ์ธํฐ(pointer)
๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ณ์๋ฅผ ๋งํ๋ค. ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒ์ ์ญ์ฐธ์กฐ๋ผ๊ณ ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก ํฌ์ธํฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ก ๋ฐ๊ฟ ์ ์๋ค. ํฌ์ธํฐ๋ ๋ค๋ฅธ ๋ณ์๋ ํจ์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ฌ์ฉ๋๋ค.
C ์ธ์ด์ ํฌ์ธํฐ
- ๋ชจ๋ ๋ณ์๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ์ ์ฅ
const
์ ๊ฐ์ ๊ณ ์ ๊ฐ ๋ณ์ ์ธ์ ๋ชจ๋ ๋ณ์๋ ๋ฉ๋ชจ๋ฆฌ ์ค์RAM
์ ํ ๋น- ์ด๋ฌํ ๋ฉ๋ชจ๋ฆฌ์ ๊ณต๊ฐ์ ๊ตฌ๋ณํ๋ ๊ฒ์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ด๋ค.
- ํฌ์ธํฐ๋ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค
:: ํฌ์ธํฐ ํ ๋น ๋ฐ ํด์
C์ธ์ด์์ ๋ณ์๋ ์ ์ ๋ณ์์ ๋์ ๋ณ์๊ฐ ์๋ค. ์ฒ๋ฆฌํ ๋ฐ์ดํฐ์ ์ซ์๋ฅผ ์์ธกํ ์ ์๋ค๋ฉด ์ ์ ์ผ๋ก ์ ์ธํ๋ฉด ๋๋ค. ์์) ๋ฐฐ์ด๋ณ์
๊ทธ๋ฌ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์์ธกํ ์ ์๋ค๋ฉด ์ต๋์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋์ ์ ํ๊ณ ์ ์ ์ผ๋ก ์ ์ธํ ์ ๋ฐ์ ์๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ค.
C์์๋ ์ ํต์ ์ผ๋ก ๋์ ํ ๋น ๋ณ์๋ฅผ ์ก์ ๊ฒฝ์ฐ malloc()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ ์ฅ๊ณต๊ฐ์ ํ๋ณดํ๋ค.
- ํ ๋น
malloc()
: ํ์์ญ์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ ๊ณต๊ฐ์ ํ ๋น ๋ฐ๋๋ค. - ์ฌํ ๋น
realloc()
: ์ด๋ฏธ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ค. - ํด์
free()
: ๋ ์ด์ ์ธ ํ์๊ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ์์ญ์ ๋ฐํํ๋ค
:: ์ด์ ์ฒด์ ์์ ํ ๋นํ๋ ๋์ ๊ณต๊ฐ
ํ๋ก์ธ์์ ํ๊ณต๊ฐ์ ์ ํ์ ์ด๋ค.
MFC*(๋ง์ดํฌ๋ก์ํํธ ํ์ด๋ฐ์ด์ ํด๋์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Microsoft Foundation Class Library)๋ C++์ฉ ํ๋ก๊ทธ๋จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)*์ ๊ฐ์ ์๋ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ, ํ์์ ๋ฐ๋ผ ์ด์ ์ฒด์ ์ ์์์ ํ ๋น ๋ฐ์ ๋์ ๊ณต๊ฐ์ ํ๋ณดํ ์ ์๋ค
์ด๊ฒ ์ญ์ ๋์ ํ ๋น์ด๊ธฐ ๋๋ฌธ์ ํฌ์ธํฐ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ๋ค.
ํ๋ก์ธ์์์ ํ ๋น ๋ฐ์ ๊ณต๊ฐ์ ์คํ์ด ๋๋ ๋๊น์ง ๋์ ์ผ๋ก ์ ์ง๋์ง๋ง, ์ด์ ๊ด๋ จ๋ ํ ๋น์ ์ด์ ์ฒด์ ์ ๊ด๋ จ ๋์ด ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ธ์ ํ ๊ฒฝ์ฐ๋ ์๋ค.
- ํ ๋น: ์ด์ ์ฒด์ ๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์ผ๋ถ๋ฅผ ๋น๋ฆฐ๋ค. ์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ 2๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
- ์ฌํ ๋น: ์ด๋ฏธ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ค.
- ํด์ : ๋ ์ด์ ์ธ ํ์๊ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ด์ ์ฒด์ ์ ๋ฐํํ๋ค.
์ด ์์ ์ด ์ ๋๋ก ์ด๋ฃจ์ด์ง์ง ์์ ๊ฒฝ์ฐ ์ด์์ฒด์ ๋ ๋ฆฌ์์ค ๋ถ์กฑ, ์ ์ ์๋ ์ค๋ฅ, ์๋ชป๋ ์ฐ์ฐ ์ํ๊ณผ ๊ฐ์ ์ค๋ฅ๋ฅผ ์ผ์ผํจ๋ค
โ๏ธ ํฌ์ธํฐ ๋ณ์ ์ ์ธ
int a = 5;
int *b = &a;
int *b = &a;
์ฒ๋ผ ์ ์ธํ ๋์๋ ๋ณ์๋ช ์์ *๋ฅผ ๋ถํ์ ํฌ์ธํฐ ๋ณ์์์ ๋ช ์- ์ ์ธํ ์ดํ์
*b
๋ผ๊ณ ์ฐ๊ฒ ๋๋ฉด, ํฌ์ธํฐ ๋ณ์ b๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์์ ๊ฐ์ ์๋ฏธ. ์ฆ 5๊ฐ ๋๋ค &a
๋ ๋ณ์a
์&
๋ฅผ ๋ถํ์ผ๋กa
์ ์ฃผ์๊ฐ์ ์๋ฏธ
์ด๋ฆ | ์ค๋ช |
---|---|
์ฃผ์ ์ฐ์ฐ์(&) | ๋ณ์ ์์ ๋ถ์ด์ ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฃผ์ ๊ฐ์ ๊ตฌํจ |
ํฌ์ธํฐ(*) | ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธํ ๋ ์ฌ์ฉ |
๊ฐ์ ์ฐธ์กฐ ์ฐ์ฐ์(*) | ์ ์ธ๋ ํฌ์ธํฐ ๋ณ์๊ฐ ๊ฐ๋ฆฌํค๋ ๋ณ์๋ฅผ ๊ตฌํจ |
์์ ์ฝ๋
#include <stdio.h>
int main(void) {
int a = 5;
int *b = &a; // (1)
printf("%d\n", *b); // (2)
system("pause");
return 0;
}
(1) ์ด๋์ *b
์ *
์ ํฌ์ธํฐ. ํฌ์ธํฐ ๋ณ์ b๊ฐ a๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค
(2) ์ด๋์ *b
์ *
์ ๊ฐ์ ์ฐธ์กฐ ์ฐ์ฐ์. ํฌ์ธํฐ ๋ณ์ b๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ณ์ ๊ฐ์ ๊ฐ๋ฆฌํค๊ณ ์๋ค. ์ฆ, 5
โ๏ธ ๋ค์ค ํฌ์ธํฐ
๋ค์ค ํฌ์ธํฐ์ ๊ฐ๋ ๋ ์๋ค. ์์) ํฌ์ธํฐ์ ํฌ์ธํฐ
int *a = 5;
int *b = &a;
int **c = &b;
:: ํฌ์ธํฐ ๋ฐฐ์ด
โ๏ธ ํฌ์ธํฐ ๋ฐฐ์ด์ ๊ตฌ์กฐ ๋ถ์
- ๋ฐฐ์ด์ ํฌ์ธํฐ์ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋์ํ๋ค
- ๋ฐฐ์ด์ ์ด๋ฆ์ ๋ฐฐ์ด์ ์์์ ์ฒซ ๋ฒ์งธ ์ฃผ์๊ฐ ๋๋ค
- ์ ์ผํ ์ฐจ์ด์ ์, ํฌ์ธํฐ๋ ๋ณ์์ด๋ฉฐ ๋ฐฐ์ด์ ์ด๋ฆ์ ์์์ด๋ค
- ์ฆ, ํฌ์ธํฐ๋ ๋ณ์๋ ๋ผ์ ๋ฐ๋ ์ ์์ง๋ง
- ๋ฐฐ์ด์ ์ด๋ฆ์ ์์๋ผ์ ๋ฐ๋ ์ ์๋ค
1)์์ ์ฝ๋
#include <stdio.h>
int main(void) {
int a = 10;
int b[10]; // (1)
b = &a; // (2)
system("pause");
return 0;
}
(1) ๋ณ์ b๋ฅผ ์ ์ธํ๊ณ 10 ํฌ๊ธฐ์ ๋ฐฐ์ด์ด๋ผ๊ณ ์ง์ (2) ๋ณ์๋ช b๋ ์์์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์ฃผ์๊ฐ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๋ค. ์ฆ ์ค๋ฅ ๋ฐ์.
2)์์ ์ฝ๋
ํ์ง๋ง ๋ฐ๋๋ก ํฌ์ธํฐ๋ฅผ ๋ฐฐ์ด์ฒ๋ผ ์ฌ์ฉํ ์๋ ์๋ค
#include <stdio.h>
int main(void) {
int a[5] = {1, 2, 3, 4, 5};
int *b = a; // (1)
printf("%d\n", b[2]); // (2)
system("pause");
return 0;
}
(1) b๋ผ๋ ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธํ๊ณ a๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ํจ (2) b[2]๋ฅผ ์ถ๋ ฅ. ์ฆ b๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ a[2]๋ฅผ ์ถ๋ ฅํ๋ฏ๋ก ๊ฒฐ๊ณผ๋ 3
3)์์ ์ฝ๋
๋ฐฐ์ด์ ์ด๋ฆ์ ๋ฐฐ์ด์ ์์์ ์ฒซ ๋ฒ์งธ ์ฃผ์๊ฐ ๋๋ค
#include <stdio.h>
int main(void) {
int a[5] = {1, 2, 3, 4, 5};
int *b = &a[0]; // (1)
printf("%d\n", b[2]);
system("pause");
return 0;
}
(1) ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์ ๊ฐ์ ๋ฃ์ด๋ ๋์ผํ๊ธฐ ๋์.
์ฆ int *b = a
์ int *b = &a[0]
๋ ๊ฐ์ ์๋ฏธ
:: ํจ์ ํฌ์ธํฐ
- C์ธ์ด์์๋ ํจ์์ ์ด๋ฆ์ ์ด์ฉํด ํน์ ํ ํจ์๋ฅผ ํธ์ถ
- ํจ์์ ์ด๋ฆ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐํ ์ฆ, ๋ฐฐ์ด์ ์ด๋ฆ์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ ๋ฐํํ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํจ์ ๋ํ ๋ด๋ถ์ ์ผ๋ก ์ปดํจํฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๋ณด๊ฐ ์ ์ฅ๋๋ค๋ ๊ฒ์ ์๋ฏธ
#include <stdio.h>
void function() {
printf("hello world");
}
int main(void) {
printf("%d\n", function); // (1)
system("pause");
return 0;
}
(1) function์ด๋ผ๋ ํจ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ด ์ถ๋ ฅ
- ํจ์ ํฌ์ธํฐ๋ ํน์ ํ ํจ์์ ๋ฐํ ์๋ฃํ์ ์ง์ ํ๋ ๋ฐฉ์์ผ๋ก ์ ์ธํ ์ ์๋ค.
- ํจ์ ํฌ์ธํฐ๋ฅผ ์ด์ฉํ๋ฉด ํํ๊ฐ ๊ฐ์ ์๋ก ๋ค๋ฅธ ๊ธฐ๋ฅ์ ํจ์๋ฅผ ์ ํ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
| ๋ฐํ ์๋ฃํ(*์ด๋ฆ)(๋งค๊ฐ ๋ณ์) = ํจ์๋ช ; | | โโโโโโโโโโโโโ- |
#include <stdio.h>
void myFunction() {
printf("hello");
}
void yourFunction() {
printf("world");
}
int main(void) {
void(*fp)() = myFunction;
fp();
fp() = yourFunction;
system("pause");
return 0;
}
๋ ๊ฐ์ ํจ์๊ฐ ์ฐจ๋ก๋๋ก ์คํ๋๋ฉด์ hello world๋ฅผ ์ถ๋ ฅ
โจ tl;dr
- ํฌ์ธํฐ์ ๊ฐ๋
- ํฌ์ธํฐ๋ ํน์ ํ ๋ณ์ ์์ฒด๊ฐ ์กด์ฌํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์์ ๊ฐ์ ๊ฐ์ง๋ค
- ๋จ์ํ ์ฃผ์๊ฐ๋ง ์ ์ฅํ๋๊ฒ ์๋, ์ด๋ค ์๋ฃํ์ธ์ง๋ ํฌํจํ์ฌ ์ ์ฅ
- ํฌ์ธํฐ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ
- ํฌ์ธํฐ๋ ์ปดํจํฐ ์์คํ ์ ํน์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ๋ก ์ ๊ทผํ ์ ์๋ค
- ๋ฐ๋ผ์ ๊ธฐ์กด์ ์กด์ฌํ๋ ์ค์ํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ๊ทผํ์ง ์๋๋ก ํด์ผ ํ๋ค
- ๋ค์ค ํฌ์ธํฐ์ ๊ฐ๋ ๋ ์๋ค. ์์) ํฌ์ธํฐ์ ํฌ์ธํฐ
- ๋ฐฐ์ด๊ณผ ํฌ์ธํฐ๋ ์ฌ์ค ๋ด๋ฌด์ ์ผ๋ก ๊ฑฐ์ ๋์ผํ๋ค. ๋ฐฐ์ด์ ์ ์ธํ ์ดํ์๋ ๊ทธ ์ด๋ฆ ์์ฒด๋ฅผ ํฌ์ธํฐ ๋ณ์์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.