pointer - KimTaebin-ai/study_posts GitHub Wiki
c ์ธ์ด์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฃํ์ด ๋ค๋ฅธ ํฌ์ธํฐ๋ผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ฉด ์ปดํ์ผ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ๋ค.
int main(void)
{
int a = 10;
char b = 't';
int *int_point = &a;
char *char_point = &b;
int_point = char_point; // ์ค๋ฅ๋ฐ์
return 0;
}
warning: assignment from incompatible pointer type
ํ์ง๋ง void ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ด๋ค ์๋ฃํ์ ํฌ์ธํฐ๋ ๋ชจ๋ ์ ์ฅํ ์ ์๋ค.
int main(void)
{
int a = 10;
char b = 't';
int *int_point = &a;
char *char_point = &b;
void *ptr;
ptr = int_point; // ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค
ptr = char_point;
int_point = ptr;
char_point = ptr;
return 0;
}
๋ฐ๋ผ์ ์ฌ์ฉ๋ฐฉ๋ฒ์ ํจ์์ ์ค๋ฒ๋ก๋ฉ ํ์์ฒ๋ผ ๊ฐ๋ณ์ ์ธ ํฌ์ธํฐ๋ณ์๋ฅผ ๋ฐ์์ผ ํ๋ ํจ์๋ค์ ์ธ์๊ฐ์ผ๋ก ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
voidํฌ์ธํฐ๋ ์ญ ์ฐธ์กฐ(์ฌ์ฉ)ํ ์ ์๋ค๊ณ ํ๋๋ฐ ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ํจ์ ๋ด์์ ์์ ์ ์ํํ ๊น
ํฌ์ธํฐ์ ์ฃผ์๊ฐ ์์ฒด๊ฐ ๋ฉ๋ชจ๋ฆฌ๊ธฐ ๋๋ฌธ์ 1๋ฐ์ดํธ์ฉ ์ฝ์ ์ ์๋ char ํฌ์ธํฐํ์ผ๋ก ๊ฐ์ ํ๋ณํ์ ํตํด ์ฌ์ฉํ๋ค..!
char ํฌ์ธํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ฐ์ฐ์ ์ฌ์ฉํ๋ ์ด์ ๋ ์๋์์ ์ค๋ช ํ๋ค.
c์์๋ ๋ถํธ๋ฅผ ๊ณ ๋ คํ์ง ์๋ ๊ฒฝ์ฐ unsigned
๋ฅผ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ ์ํฉ์ ๋ฐ๋ผ ์์๊ฐ ๋ถํ์ํ ๊ฒฝ์ฐ unsigned
๋ฅผ ํ์ฉํ๋ค.
๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํธ๋ฅผ ์์๋ก ํด์ํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ๋ถํธ์ ์๊ด์์ด ์ทจ๊ธํ๋ ค๋ฉด unsigned char๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์์ ํ๋ค.
์ฆ, 1๋ฐ์ดํธ(8๋นํธ)๋ฅผ ํฌ๋ช ํ๊ฒ ์ฌ์ฉํ ์ ์๋ค๋ ์
๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ unsigned char ์๋ฃํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ธฐ๋ณธ์ด๋ฉฐ ๊ด๋ก๋ผ๊ณ ํ๋ค
๋ฐ๋ผ์ voidํฌ์ธํฐ ํ์ฉ ์ unsigend char ํฌ์ธํฐ๋ก ํ ๋ณํํ์ฌ ์์ ํ๊ฒ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ์
๋จผ์ constํค์๋๋ ์์ ํค์๋๋ก ๋ณํ์ง์๊ณ ์๋ณธ์ ์ ์งํ๊ณ ์ ํ ๋ ์ฌ์ฉํ๋ค.
ํจ์ ๋ด์์ src. ์ฆ, ์๋ณธ์ ํฌ์ธํฐ๋ก ๋๊ฒจ์ฃผ์ด ๊ฐ์ ์ฐธ์กฐํ ๋ ์๋ณธ์ ๊ฐ์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ๊ฒ ํ์ฌ ๋ณด์์ฑ์ ์ ์งํ ์ ์๋ค.
const char *p
์ด๋ ํฌ์ธํฐ p๊ฐ ๊ฐ๋ฅดํค๋ ์๋ฃํ์ด const char ๋ผ๋ ์๋ฏธ์ด๋ค. ์ด ๋ ํฌ์ธํฐ p ๋ readonly ์ ์ฑ๊ฒฉ์ ๊ฐ์ง๊ฒ ๋๋ค.
๋ฐ๋ผ์ ํฌ์ธํฐ์ ์ญ์ฐธ์กฐ๋ฅผ ํตํ ๊ฐ ๋ณ๊ฒฝ์ ๋ถ๊ฐํ๋ค.
int main(void)
{
char str[20] = "Hello";
const char *char_point = str;
*(char_point+1) = 'y'; // ์๋ฌ
char_point++; // ๊ฐ๋ฅ readonly
return 0;
}
// ๋ง์ฐฌ๊ฐ์ง๋ก char_point + 1๋ํ const char์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ์ด๋ค.
๊ฐ์ ํ๋ณํ์ ํตํด ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ง๋ง ํจ์ ์ค๊ณ ๋ฐฉ๋ฉด์ผ๋ก ๊ฐ๋ฐ์๊ฐ strcpy๊ฐ์ ํจ์์ src(์๋ณธ)์ const์ ๊ฑธ์ด๋๊ฒ ๋๋ค๋ฉด ์ด๋ readonly๋ก๋ง ์ฌ์ฉํ๋ผ๋ ๋ป์ด๊ธฐ ๋๋ฌธ์ ๋๋๋ก ๊ฐ์ ํ๋ณํํ์ฌ ์๋ณธ์ ์์ ํ์ง ์๋๋ก ํ์
๊ฐ์ ํ๋ณํ ๋ฐฉ๋ฒ
int main(void)
{
char str[20] = "Hello";
const char *char_point = str;
s
*((char *)(char_point+1)) = 'o'; // ๋ณ๊ฒฝ๊ฐ๋ฅ
printf("%s", char_point);
return 0;
}
char * const p
char ํ์ ๊ฐ๋ฆฌํค๋ ์ฃผ์๊ฐ์ด ์์๋ผ๋ ํฌ์ธํฐ์ด๋ค. ์ด๋ฅผ ์์ ํฌ์ธํฐ๋ผ๊ณ ๋ถ๋ฅธ๋ค.
int main(void)
{
char str[20] = "Hello";
char *const char_point = str;
*(char_point+1) = 'o'; // ๊ฐ๋ฅ
//char_point++; ๋ถ๊ฐ๋ฅ
printf("%s", char_point);
return 0;
}
ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์๋ ๋ณ๊ฒฝํ ์ ์์ง๋ง, ๊ทธ ์ฃผ์์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝํ ์ ์๋ค.
๊ทธ๋ฌ๋ ํฌ์ธํฐ ์์ฒด๊ฐ ์์์ด๋ฏ๋ก ํฌ์ธํฐ์ ์ฃผ์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์ฐ์ฐ์ ๋ถ๊ฐํ๋ค.
ํจ์์ ์ฃผ์๋ฅผ ๋ด๋ ํฌ์ธํฐ ๋ณ์์ด๋ค. (4 byte)
ํจ์๋ ์ฃผ์๋ก ๋ณผ ์ ์๋ ๊ฒ์ด๋ค.
void (*fp)();
- void: ๋ฐํ๊ฐ ์๋ฃํ
- (*fp): ํจ์ ํฌ์ธํฐ ์๋ณ์
- (): ๋งค๊ฐ๋ณ์๊ฐ ์์
์ฆ, ๋ฐํ๊ฐ์ด ์๊ณ ๋งค๊ฐ๋ณ์๋ ์๋ fp๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ํจ์ํฌ์ธํฐ๋ฅผ ์ ์ธํ ๊ฒ์ด๋ค.
#include <stdio.h>
void print_void()
{
printf("Hello world\n");
}
int main()
{
void(*fp)() = print_void;
fp();
printf("%p\n", fp);
printf("%p\n", print_void);
return 0;
}
์ ์ฝ๋์ ๊ฒฐ๊ณผ์์ %p
๋ก ์ฐ์ ์ฃผ์๊ฐ์ ๋์ผํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
++ ๋ฐํ๊ฐ์ด๋ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ํจ์ ํฌ์ธํฐ
int (*fp)(int, int);
fp๋ function pointer์ ์ฝ์ด
๋๊ธ๋ง ํฌ์ธํฐ(Dangling Pointer)๋ ์ด๋ฏธ ํด์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ๋ฅผ ๊ณ์ํด์ ๊ฐ๋ฆฌํค๊ณ ์๋ ํฌ์ธํฐ๋ฅผ ๋งํ๋ ๊ฒ์ผ๋ก ์ ํจํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๊ธฐ ๋๋ฌธ์ Segmentation fault ๊ฐ ๋ฐ์ํ ์ ์๋ค.
Dangling Pointers ๋ฌธ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ง๋ง, ๊ฐ์ฅ ์ข์ ๊ฒ์ ํ๋ก๊ทธ๋๋จธ์ ์์ผ๋ก ๋์ ํ ๋น ๋ณ์๋ฅผ ํ ๋น ํด์ ํ๋ ๊ฒ์ด๋ค. ํ๋ก๊ทธ๋จ์ด ๋ช ์์ ์ผ๋ก ๋์ ํ ๋น์ ํด์ ํ ๋ ํ ๋น ํด์ ํ ์ ์๋ ๊ฒฝ์ฐ์๋ dangling pointers๊ฐ ์๋ค. ์ด๋ฅผ ์ํด์, run time system์ ํ ๋์ ๋ณ์๊ฐ ๋ ์ด์ ์ ์ฉํ์ง ์์ ๋ ์์์ ์ผ๋ก ํ ๋น์ ํด์ ํด์ผ ํ๋ค.