-
반응형
대상의 크기가 정해져 있지 않은 void *형 포인터
void 키워드 : 정해져 있지 않다.
포인터 변수가 가리키는 대상의 크기를 모를 때 void * 형을 사용
사용할 메모리의 시작 주소만 알고 끝 주소를 모를 때 void*형 포인터 사용
int data = 0; void *p = &data; *p = 5; // 오류 발생, 대상 메모리의 크기가 정해지지 않음
void * 는 주소를 사용할 때 반드시 ‘사용할 크기’를 표기해야 한다
int data = 0; void *p = &data; *(int *)p = 5; // casting 문법을 사용하여 대상의 크기를 4바이트로 지정
void * 형 포인터 활용하기
- void * 는 자신이 사용할 대상의 크기 지정을 잠시 미룰 수 있다는 장점을 지님
- main 함수의 지역 변수의 주소를 받아 1을 대입하는 MyFunc 함수
(MyFunc 함수에 전달되는 주소의 형식이 char *, short * , int * 중 하나)void MyFunc(char *p_char, short *p_short, int *p_int) // 어떤 형식의 주소 값이 전달될지 모르기에 세 개의 포인터를 매개변수로 둠 { if(p_char != NULL) *p_char = 1; else if(p_short != NULL) *p_short = 1; else *p_int = 1; } void main() { short data= 5; MyFunc(NULL, &data, NULL); }
void * 형 포인터를 사용하여 지역 변수의 값 변경하기
void MyFunc(void *p, char flag) { // flag 에 전달된 값에 따라 형 변환하여 전달된 주소에 1을 대입 if(flag == 0) *(char *)p = 1; // flag가 0이면 char형 else if(flag == 1) *(short *)p = 1; // flag가 1이면 short형 else *(int *)p = 1; // flag가 2이면 int형 } void main() { short data= 5; // data 변수는 short 형 이기 때문에 short *를 의미하는 1을 함께 전달 MyFunc(&data, 1); }
void *를 사용하여 대상 메모리의 크기 조절하기
#include <stdio.h> int GetData(void *p_data, char type) { int result = 0; // type 매개변수에 전달된 값을 기준으로 형 변환을 달리함 if(type == 1) result = *(char *)p_data; // 0x78(1바이트) 저장 else if(type == 2) result = *(short *)p_data; // 0x5678(2바이트) else if(type == 4) result = *(int *)p_data; // 0x12354678 return result; } void main() { int data = 0x12345678; printf(“%X\n”, GetData(&data, 2)); }
포인터 변수에 직접 형 변환을 사용하는 형식은 모든 포인터에서 사용할 수 있는 개념
int data = 0x12345678 char *p = (char *)&data; // 서로 자료형이 맞지 않아 (char *)로 형 변환 *p = 5; // data 변수의 시작 1바이트에 5를 넣으면 0x12345605로 변경 *(short *)p = 0; // data 변수의 시작 2바이트에 0을 넣으면 0x12340000 으로 변경
반응형'C' 카테고리의 다른 글
표준 입력 함수 (0) 2022.05.19 포인터와 대상의 크기 (0) 2022.05.17 포인터 변수의 주소 연산 (0) 2022.05.16