ํฌ์ธํฐ ์ฃผ์์ฐ์ฐ, ๋์ ํฌ๊ธฐ, void *ํ ํฌ์ธํฐ
- -
๋ชจ๋ ์ค์ต ์ฝ๋๋ ๊น์ฑ์ฝ ๋ํ๋์
"Do it ! C์ธ์ด ์ ๋ฌธ" ์ฑ ์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ค์ตํ๊ณ ๋ด์ฉ์ ์์ฝํ ๊ฒ์ ๋๋ค.
โป ์์ ์ฉ๋๊ฐ ์๋๋ฉฐ, tips๋ฅผ ํตํด ๋ฐฐ์ด ๋ด์ฉ์ ๋ณต์ตํ๊ณ ์ ์ค์ค๋ก ๊ณต๋ถํ๋ ๋ชฉ์ ์ผ๋ก ์ฌ๋ฆฌ๋ ๊ฒ์ด๋
๋ถ๋ฒ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๊ธ์งํฉ๋๋ค.
์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ์ ๋ฒ์๋ฅผ ๊ธฐ์ตํ๋ ๋ฐฉ๋ฒ
์์ ์ด ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ์ ๋ฒ์๋ฅผ ๊ธฐ์ตํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ์ง์ด๋ค.
์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์์ ์ฃผ์์ ๋ ์ฃผ์๋ฅผ ๊ธฐ์ตํ๋ ๊ฒ์ด๊ณ , ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์์ ์ฃผ์์ ์ฌ์ฉํ ํฌ๊ธฐ๋ฅผ ๊ธฐ์ตํ๋ ๊ฒ์ด๋ค.
์์ ์ฃผ์์ ๋ ์ฃผ์๋ก ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ ๊ธฐ์ตํ๊ธฐ.
์์ ์ฃผ์์ ๋ ์ฃผ์๋ก ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๋ฅผ ๊ธฐ์ตํ๋ ค๋ฉด ๊ฐ๊ฐ์ ์ฃผ์๋ฅผ ๊ธฐ์ตํ๋ ๋ฐ ์ด 8byte๊ฐ ํ์ํ๋ค.
์์ ์ฃผ์์ธ 100๋ฒ์ง๋ฅผ ์ ์ฅํ๊ธฐ ์ํด 4byte๊ฐ ํ์ํ๊ณ ,
๋ ์ฃผ์์ธ 103๋ฒ์ง๋ฅผ ์ ์ฅํ๋ ๋ฐ ๋ 4byte๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์์ ์ฃผ์์ ์ฌ์ฉํ ํฌ๊ธฐ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ฒ์ ๊ธฐ์ตํ๊ธฐ
'์์ ์ฃผ์'์ '์ฌ์ฉํ ํฌ๊ธฐ'๋ก ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๋ฅผ ๊ธฐ์ตํ๋ ๊ฒ๋ ๋ ๊ฐ์ง ์ ๋ณด๋ฅผ ๊ธฐ์ตํด์ผ ํ๋ค.
์์ ์ฃผ์์ธ 100๋ฒ์ง๋ฅผ ์ ์ฅํ๋ ๋ฐ 4byte๊ฐ ํ์ํ ๊ฒ์ด๊ณ , ์ฌ์ฉํ ํฌ๊ธฐ๋ฅผ ์ ์ฅํ๋๋ฐ ๋ 4byte๊ฐ ํ์ํ ๊ฒ์ด๋ค.
๊ทธ๋ฐ๋ฐ!
C์ธ์ด ๋ฌธ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ํญ์ ๊ทธ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋ฅผ ๋จผ์ ๊ฒฐ์ ํ๋๋ก ๋์ด ์๋ค.
์๋ฅผ ๋ค์ด ์ ์ ๊ฐ 5๋ฅผ ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด int data; ์ ๊ฐ์ด ๋ณ์๋ฅผ ์ ์ธํด์ผ ํ๋๋ฐ
์ด๋ ์ฌ์ฉํด์ผ ํ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ๋
intํ์ผ๋ก ์ ์ธํ๊ธฐ ๋๋ฌธ์ 4byte๋ก ๊ฒฐ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ data = 5; ๋ช ๋ น์ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ๋ฌ๋ data๋ผ๋ ๋ณ์๊ฐ 4byte๋ผ๋ ๊ฒ์
์ด๋ฏธ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์ 4byte ํฌ๊ธฐ๋ก 5๋ฅผ ๋์ ํ๋๋ก ๋ช ๋ น์ ๊ตฌ์ฑํ๊ฒ ๋๋ค.
๊ฒฐ๊ตญ ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋ ๋ช ๋ น๋ฌธ์ ํฌํจ๋์ด ์๊ธฐ ๋๋ฌธ์ ์์ ์ด ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ฃผ์๋ง ๊ธฐ์ตํด๋ ๋๋ค๋ ๋ป์ด๋ค.
์ด๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํน์ฑ ๋๋ฌธ์ ํฌ์ธํฐ๋ ์์ ์ด ๊ฐ๋ฆฌํฌ ๋์์ ๋ํด ์ฌ์ฉํ ๋ฒ์๋ ์ ์ฅํ์ง ์๊ณ
์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ฃผ์๋ง ๊ธฐ์ตํ๋ฉด ๋๋ค
#include<stdio.h>
void main(){
short data = 0;
short *p = &data; //p๋ณ์์ data๋ณ์์ ์์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ค. ๋ ์ฃผ์๋ ํฌ๊ธฐ๋ ๋ช
์x
*p = 5; //ํฌ์ธํฐ ๋ณ์ p๊ฐ ๊ฐ๋ฅดํฌ ๋์์ ํฌ๊ธฐ๋ short์ด๋ฏ๋ก p์ ์ ์ฅ๋ ์์ ์ฃผ์๋ถํฐ 2byte ํฌ๊ธฐ ๊ณต๊ฐ์ ๊ฐ 5๋ฅผ ์ ์ฅํจ.
}
ํฌ์ธํฐ๊ฐ ์์ ์ด ๊ฐ๋ฅดํฌ ๋์ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ฃผ์๋ง ๊ธฐ์ตํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฒ ๋๋ ํน์ฑ์ด ์๋ค.
๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด์.
#include<stdio.h>
void main(){
short data = 0;
short *p = &data;
p = p+1; // ํฌ์ธํฐ ๋ณ์์ ์ ์ฅ๋ ์ฃผ์ ๊ฐ์ 1๋งํผ ์ฆ๊ฐ์ํด
}
ํฌ์ธํฐ ๋ณ์์ ์ ์ฅ๋ ์ฃผ์๋ ์ ์ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ ๋ณ์์ฒ๋ผ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค.
ํ์ง๋ง
์ฃผ์๋ฅผ 1๋งํผ ์ฆ๊ฐ์ํจ๋ค๋ ์๋ฏธ๋ ์ํ ์ฐ์ฐ๊ณผ ๋ค๋ฅด๋ค.
ํฌ์ธํฐ์์ +1์ ์๋ฏธ๋ ๋จ์ํ ์ฃผ์ ๊ฐ์ +1์ ๋ํ๋ค๋ ๋ป์ด ์๋๊ณ ,
๊ทธ ๋ค์ ๋ฐ์ดํฐ์ ์ฃผ์๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์
"์๋ฃํ์ ํฌ๊ธฐ๋ฅผ ๋ฐ๋ฅด๊ฒ ๋๋ค."
์ด์ฒ๋ผ ํฌ์ธํฐ ๋ณ์์ +1์ ํ๋ฉด ์์ ์ด ๊ฐ๋ฅดํค๋ ๋์์ ํฌ๊ธฐ๋งํผ ์ฆ๊ฐํ๊ฒ ๋๋๋ฐ,
์ด๊ฒ์ "ํฌ์ธํฐ ๋ณ์์ ์ฃผ์ ์ฐ์ฐ"์ด๋ผ๊ณ ํ๋ค.
์๋ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉด ๋ชจ๋ 100๋ฒ์ง๋ฅผ ๋์ ํ์์ง๋ง
++์ฐ์ฐ์ ํ๊ณ ์ฃผ์ ๊ฐ์ ์ดํด๋ณด๋ฉด ๋ชจ๋ ๋ค๋ฅธ ์ฃผ์๋ฅผ ๊ฐ๋ฅดํค๊ณ ์๋ค.
#include<stdio.h>
void main() {
/*
๊ฐ์ ์ ๋ถ (์๋ฃํ *)๋ฅผ ํด์ฃผ๋ ์ด์ ๋ ์บ์คํ
, ์ฆ ํ ๋ณํ์ ํด์ฃผ๋ ์์
์ด๋ค.
์ผ๋ฐ ์์๋ ํฌ์ธํฐ์ ํ์ด ๋ค๋ฅด๋ฏ๋ก, ์๋ฃํ์ ๋ง์ถฐ์ฃผ๋ ๊ฒ์ด๋ค.
"์๋ฃํ์ ๋ณ์ ๋ช
์ ๋บ ๋๋จธ์ง" ๋ฅผ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ char *, short * ๋ฑ.. ๋ณ์ ๋ช
์ ๋บ ์๋ฃํ์
๋ช
์ํ์ฌ ํ์ ๋ง์ถ์ด ์ฃผ๋ ๊ฒ์ด๋ค.
*/
char* p1 = (char*)100; // p1์ 100๋ฒ์ง๋ฅผ ์ ์ฅํจ.
short* p2 = (short*)100; // p2์ 100๋ฒ์ง ์ ์ฅ
int* p3 = (int*)100; // p3์ 100๋ฒ์ง ์ ์ฅ
double* p4 = (double*)100; //p4 ์ 100๋ฒ์ง ์ ์ฅ
p1++; // ๊ฐ๋ฅดํค๋ ๋์์ ํฌ๊ธฐ๊ฐ charํ (1byte)์ด๊ธฐ ๋๋ฌธ์ p1์ ์ ์ฅ๋ ์ฃผ์ ๊ฐ์ด 101์ด๋จ.
p2++; // ๊ฐ๋ฅดํค๋ ๋์์ ํฌ๊ธฐ๊ฐ shortํ (2byte)์ด๊ธฐ ๋๋ฌธ์ p2์ ์ ์ฅ๋ ์ฃผ์ ๊ฐ์ด 102๊ฐ ๋จ.
p3++; // ๊ฐ๋ฅดํค๋ ๋์์ ํฌ๊ธฐ๊ฐ intํ (4byte)์ด๊ธฐ ๋๋ฌธ์ p3์ ์ ์ฅ๋ ์ฃผ์ ๊ฐ์ด 104๊ฐ ๋จ.
p4++; // ๊ฐ๋ฅดํค๋ ๋์์ ํฌ๊ธฐ๊ฐ doubleํ (8byte)์ด๊ธฐ ๋๋ฌธ์ p4์ ์ ์ฅ๋ ์ฃผ์ ๊ฐ์ด 108์ด ๋จ.
printf("p1์ ์ฃผ์ : %d\np2์ ์ฃผ์ : %d \np3์ ์ฃผ์ : %d \np4์ ์ฃผ์ : %d", p1, p2, p3, p4);
}
ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํค๋ ๋์์ ํฌ๊ธฐ
int *p ๋ผ๊ณ ํฌ์ธํฐ ๋ณ์๋ฅผ ์ ์ธํ ๋ int ์๋ฃํ์ ํฌ์ธํฐ ๋ณ์์ ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด ์๋๋ค.
ํฌ์ธํฐ๋ 32bit์ปดํจํฐ(os) ๊ธฐ์ค 4byte๋ก ์ ํด์ ธ์๊ณ , ์์ ํฌ์ธํฐ ์์ ์จ์ฃผ๋ ์๋ฃํ์ ๊ฒฐ๊ตญ
ํฌ์ธํฐ ๋ณ์๊ฐ ๊ฐ๋ฅดํค๋ ๋์์ ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ํฌ์ธํฐ ๋ณ์ p์ ์ผ๋ฐ ๋ณ์ data์ ์ฃผ์ ๊ฐ์ ์ ์ฅํ๊ณ ํฌ์ธํฐ ๋ณ์ p๋ฅผ ์ฌ์ฉํ์ฌ data ๋ณ์์ ๊ฐ์
๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ์๋ ๋ ๋ณ์์ ์๋ฃํ์ ๊ฐ๊ฒ ์ง์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ค.
์ฆ ์ค์ ๋์ ํฌ๊ธฐ๊ฐ 4byte๋ผ๋ฉด ํฌ์ธํฐ ๋ณ์์ ์๋ฃํ๋ 4byte ํฌ๊ธฐ๋ก ์ง์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๋ผ๋ ๊ฒ์ด๋ค.
int data = 0;
int *p = &data;
์ด๋ ๊ฒ ๋ ๊ฐ์ ์๋ฃํ์ด ๊ฐ์์ผ ํ๋ค.
๋ง์ฝ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํฌ ์ ์๋ ํฌ๊ธฐ์ ์ค์ ๋์์ ํฌ๊ธฐ๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ์ ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
์ค์ ํฌ๊ธฐ์ ๋ค๋ฅธ ๊ฒฝ์ฐ
ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํฌ ์ ์๋ ํฌ๊ธฐ์ ์ค์ ๋์์ ํฌ๊ธฐ๊ฐ ๊ผญ ๊ฐ์์ผ ํ๋ ๊ฒ์ ์๋๋ค.
ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋์ ์ผ๋ก ์ด ๋ ํฌ๊ธฐ๋ฅผ ๋ค๋ฅด๊ฒ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์๋ค.
int data = 0;
short *p = (short *)&data;
์ ์์๋ฅผ ๋ณด๋ฉด, data๋ int ์๋ฃํ์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก, short๋ก ํ๋ณํ์ ํด์ฃผ์ด์ผ ํ๋ค.
ํฌ์ธํฐ ๋ณ์ p๋ 2byte์ ํฌ๊ธฐ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ์ง๊ณ ์์ง๋ง,
4byte ํฌ๊ธฐ์ธ data ๋ณ์๋ฅผ ๊ฐ๋ฆฌํฌ ์๋ ์๋ค.
์ด๋ฌํ ํฌ์ธํฐ์ ํน์ฑ์ ํ์ฉํ๋ฉด 4byte ํฌ๊ธฐ์ ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ 1byte ๋จ์๋ก ์ถ๋ ฅํ ์๋ ์๋ค.
๋ค์ ์์ ๋ฅผ ์ดํด๋ณด์.
#include<stdio.h>
void main()
{
int data = 0x12345678, i;
char* p = (char*)&data;
/*4๋ฐ์ดํธ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํธ ๋จ์๋ก ๊ฐ์ ์ถ๋ ฅํ๊ธฐ ์ํด 4๋ฒ ๋ฐ๋ณตํจ */
for (i = 0; i < 4; i++) {
printf("%X ", *p); //p๋ char *ํ์ด๋ผ์ ์์ ์ฃผ์๋ถํฐ 1byte ํฌ๊ธฐ๋ง ์ฌ์ฉํจ.
p++; // p๊ฐ char * ํ์ด๋ผ์ 1byte๋ค์ ์๋ ์ฃผ์๋ก ๊ฐ์ด ๋ณ๊ฒฝ๋จ.
}
}
์ด์ ๊ฐ์ด *p๋ฅผ ์ฌ์ฉํ๋ฉด data ๋ณ์์ ์์ ์ฃผ์์์ 1byteํฌ๊ธฐ๋ง ์ฌ์ฉํ ์ ์๋ค.
"ํฌ์ธํฐ์ ์ฃผ์ ์ฐ์ฐ์ ํ์ฉํ๋ฉด data๋ณ์์ ๋๋จธ์ง ๋ถ๋ถ๋ 1byte์ฉ ์ฌ์ฉ ๊ฐ๋ฅ!"
๋ฐฐ์ด์์ ํํ์ผ๋ก ๋ํ๋ด๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ๋ฐ๋ณต๋ฌธ๋ง ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋๋ค.
void *ํ ํฌ์ธํฐ
๋์์ ํฌ๊ธฐ๊ฐ ์ ํด์ ธ ์์ง ์๋ ํฌ์ธํฐ๋ฅผ void * ํ ํฌ์ธํฐ๋ผ๊ณ ํ๋ค.
์์์๋ ํญ์ ํฌ์ธํฐ ๋ณ์๊ฐ ๊ฐ๋ฅดํค๋ ๋์์ ํฌ๊ธฐ๋ฅผ ์ง์ ํด์ ์ฌ์ฉํ์ง๋ง, ์ด ํฌ๊ธฐ๋ฅผ ๋ชจ๋ฅธ๋ค๋ฉด ์ด๋ ํ ๋ฐฉ๋ฒ์
์ฌ์ฉํ ๊น??
์ด๋ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋ก void ํค์๋ ์ด๋ค.
void๋ '์ ํด์ ธ ์์ง ์๋ค' ๋ผ๋ ์๋ฏธ๋ก
void * p;์ ๊ฐ์ด ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ํฌ์ธํฐ ๋ณ์p์ ์ฃผ์ ๊ฐ์ ์ ์ฅํ ์๋ ์์ง๋ง ํด๋น ์ฃผ์์์
๊ฐ์ ์ฝ๊ฑฐ๋ ์ ์ฅํ ๋ ์ฌ์ฉํ๋ ํฌ๊ธฐ๋ ์ ํด์ ธ ์์ง ์๋ค.
์ฆ ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ฃผ์๋ง ์๊ณ ๋ ์ฃผ์๋ฅผ ๋ชจ๋ฅผ ๋ ์ฌ์ฉํ๋ ํฌ์ธํฐ ํ์์ด๋ค.
void * ๋ ํฌ์ธํฐ๊ฐ ๊ฐ๋ฆฌํฌ ๋์์ ํฌ๊ธฐ๋ฅผ ์ ํ ๊ฒ์ด ์๋๋ผ์ ๋ง ๊ทธ๋๋ก ์ด๋ค ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ค๋, ์๊ด์ด ์๋ค.
๊ทธ๋ ๋ค๊ณ void * ๋ก ์ ์ธํ ํฌ์ธํฐ ๋ณ์๋ฅผ ์ฃผ์ ๊ฐ๋ง ์ ์ฅํ๋ ์ฉ๋๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์๋๋ค.
ํฌ์ธํฐ ๋ณ์ p๋ฅผ ์ฌ์ฉํ์ฌ data ๋ณ์์ ๊ฐ 5๋ฅผ ๋์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ, ํ ๋ณํ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ
'์ฌ์ฉํ ํฌ๊ธฐ'๋ฅผ ํ๊ธฐ ํด์ฃผ๋ฉด ์ผ๋ฐ ํฌ์ธํฐ ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
*(int *)p ๋ผ๊ณ ์ฌ์ฉํ๋ฉด ์ผ์์ ์ผ๋ก ํฌ์ธํฐ ๋ณ์ p์ ํ์์ด int* ๊ฐ ๋๊ธฐ ๋๋ฌธ์ ํฌ์ธํฐ ๋ณ์ p์ ์ ์ฅ๋
์ฃผ์์ ๊ฐ์ 4byte ํฌ๊ธฐ๋ก 5๋ฅผ ์ ์ฅํ๋ค.
#include<stdio.h>
void main() {
int data = 0;
void * p = &data;
*p = 5; //์ค๋ฅ ๋ฐ์ : ๋์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ ์ง์ x
// ์์ ๊ฐ์ ๊ฒฝ์ฐ *(int *)p = 5; ๋ก ํ๋ณํ ๋ฌธ๋ฒ์ ์ฌ์ฉํด ์ฃผ์ด์ผ ํจ.
}
void *๋ ์ฌ์ฉ ์ ํญ์ ์บ์คํ ์ ๋๋ฐํด์ผ ํ๋ ๋ถํธํจ์ด ์๋ค.
๊ทธ๋ผ void * ํ ํฌ์ธํฐ๋ฅผ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๊น?
void * ๋ ํฌ์ธํฐ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ์๋๋ผ
์์ ์ด ์ฌ์ฉํ ๋์์ ํฌ๊ธฐ ์ง์ ์ ์ ์ ๋ฏธ๋ฃฐ ์ ์๋ค๋ ์ฅ์ ์ ๊ฐ์ง๊ณ ์๋ค.
์๋ฅผ ๋ค์ด char * ํ ์ฃผ์ ๊ฐ์ ์ ์ฅํ๋ ค๋ฉด char *ํ ํฌ์ธํฐ ๋ณ์๊ฐ ์์ด์ผ ํ๊ณ ,
int * ํ ์ฃผ์ ๊ฐ์ ์ ์ฅํ๋ ค๋ฉด int * ํ ํฌ์ธํฐ ๋ณ์๊ฐ ์์ด์ผ ํ๋ค.
ํ์ง๋ง void * ํ ๋ณ์๋ char * ํ์ด๋ , int * ํ์ด๋ ํ ๋ณํ ์์ด ๋ชจ๋ ์ ์ฅ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ ํธ๋ฆฌํ๋ค.
์ด์ ๋ํ ์์๋ฅผ ํ๋ฒ ์ดํด๋ณด์.
ex) main ํจ์์ ์ ์ธํ ์ง์ญ ๋ณ์์ ์ฃผ์ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์ ๊ทธ ์ฃผ์์ ํด๋นํ๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ 1์ ๋์ ํ๋ MyFuncํจ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์.
๊ทธ๋ฐ๋ฐ MyFunc์ผ๋ก ์ ๋ฌ๋๋ ์ฃผ์์ ํ์์ด char*, short*, int* ์ค ํ๋์ด๊ณ ์ด ํ์์ ์ฌ์ฉํ ๋๋ง๋ค ๋ฌ๋ผ์ง ์ ์๋ค๊ณ ํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
์ด๋ค ํ์์ ์ฃผ์ ๊ฐ์ด ์ ๋ฌ๋ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ์ ์์์ฒ๋ผ ์ธ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ๋งค๊ฐ๋ณ์์ ์ถ๊ฐํด์ผ ํ๋ค.
์ค์ ๋ก ์ฌ์ฉํ ํฌ์ธํฐ์๋ง ๋ณ์์ ์ฃผ์ ๊ฐ์ ์ ๋ฌํ๊ณ ,
๋๋จธ์ง๋ ์ฌ์ฉํ์ง ์๊ฒ ๋ค๋ ๋ป์ผ๋ก NULL์ ์ ๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ MyFunc ํจ์๋ก ์ ๋ฌ๋๋ ์ฃผ์์ ํ์์ด ๋ ๋ง์์ง๋ค๋ฉด, ๋งค๊ฐ๋ณ์๊ฐ ๋๋ฌด ๋ง์์ ธ ๋ถํธํ ๊ฒ์ด๋ค.
์ด๊ฒ์ void * ๋ฅผ ์ฌ์ฉํ์ฌ ์์ ํด๋ณด๋๋ก ํ๊ฒ ๋ค.
์์ ๊ฐ์ด void * ํ ํฌ์ธํฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ๋ฉด ์ด๋ค ํ์์ ์ฃผ์์ด๋ ์ ์ฅํ ์ ์์ง๋ง,
3๊ฐ์ง ์ฃผ์ ํ์ ์ค์์ ๋ฌด์์ ์ฌ์ฉํ๋์ง๋ ์ ์ ์๋ค.
๋ฐ๋ผ์ flag๋ผ๋ ์๋ฏธ ์๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ํจ๊ป ์ ๋ฌํด์ผ ํ๋ค.
void * ๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ ์กฐ์ ํ๊ธฐ
์ฌ์ฉ์๊ฐ type๋ณ์์ ๊ฐ์ ์ง์ ํ๋ฉด, ๊ทธ ํฌ๊ธฐ๋งํผ์ ๋ฐ์ดํฐ๋ง ์ถ๋ ฅํ๋ค.(1 = 1byte, 2 = 2byte ..)
#include<stdio.h>
int GetData(void* p_data, char type)
{
int result = 0;
//type ๋ณ์์ ์ ์ฅ๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํ ๋ณํ์ ๋ค๋ฅด๊ฒ ํจ.
if (type == 1)result = *(char*)p_data; //0x78(1byte)์ด ์ ์ฅ๋จ ->๋ฆฌํ์๋์ ๋ฐฉ์์ด๋ผ ๊ฑฐ๊พธ๋ก ์ ์ฅ๋จ.
else if (type == 2) result = *(short*)p_data; // 0x5678(2byte)์ด ์ ์ฅ๋จ.
else if (type == 4) result = *(int*)p_data; // 0x12345678(4byte)์ด ์ ์ฅ๋จ.
return result;
}
void main()
{
int data = 0x12345678;
// data ๋ณ์์์ 2byteํฌ๊ธฐ ๋งํผ๋ง ์ถ๋ ฅ.
printf("%X\n", GetData(&data, 2));
}
'Languages > C' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํฌ์ธํฐ ๋ณ์์์ const ํค์๋๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ (0) | 2021.01.31 |
---|---|
๋ ๋ณ์์ ๊ฐ ์๋ก ๋ฐ๊พธ๊ธฐ (0) | 2021.01.31 |
1์ฐจ์ ๋ฐฐ์ด๊ณผ 2์ฐจ์ ๋ฐฐ์ด (0) | 2021.01.30 |
Swapํจ์ ๊ธฐ๊ณ์ด(์ด์ ๋ธ)๋ก ํด์ํ๊ธฐ (0) | 2021.01.28 |
์์คํ ๊ณต๊ฐ ๊ฐ์ฌํฉ๋๋ค