void 포인터 개념
int *numPtr ; 등은 자료형이 정해진 포인터이다. 자료형이 정해지지 않은 포인터도 있는데 이를 void 포인터라 부른다.
●void포인터 코드 예제
#include <stdio.h>
int main()
{
int num = 6;
int *numPtr = # //numPtr에 num 주소 저장
void *ptr; // void 포인터 선언
// 포인터 자료형이 달라도 컴파일 경고 X
ptr = numPtr; // void 포인터에 int 포인터 저장
printf("%d", *ptr); //역참조 X
return 0;
}
// 포인터 자료형이 달라도 컴파일 경고 X
ptr = numPtr; // void 포인터에 int 포인터 저장
▲void 포인터는 자료형이 정해지지 않았기에 어떤 자료형으로 된 포인터든 다 저장할 수 있다. 직접 자료형을 변환시켜주지 않아도 암시적으로 자료형이 변환된다.
printf("%d", *ptr); //역참조 X
▲하지만 void 포인터는 역참조를 할 수 없다. 자료형이 정해지지 않았으므로, 어느 정도의 크기로 값을 가져올지 모르기 때문이다.
▼실행하면 아래와 같은 오류가 출력된다.
void 포인터 반환
, void 포인터를 반환하면 자료형에 관계없이 값을 출력할 수 있다는 장점이 있다.
●void 포인터 반환 코드 예제
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
void *voidPtr()
{
void *voidptr = malloc(200); // void 포인터에 200바이트만큼 동적 메모리 할당
return voidptr; // 동적메모리 할당된 voidptr 포인터 반환
}
int main()
{
char *s1 = voidPtr(); // void 포인터를 char 포인터에 넣음
printf("문자열을 입력하세요! ");
scanf("%s", s1); // s1에 문자열 hello 입력
printf("%s\n", s1); // s1 출력
free(s1); // 동적 메모리 해제
int *int1 = voidPtr(); //void 포인터를 int 포인터에 넣음
int1[0] = 10; //첫번째 요소에 10 저장
int1[1] = 20; //두번째 요소에 20 저장
printf("int1[0]: %d \n", *int1); //역참조로 int의 맨 앞의 값 = int[0]가져옴
printf("int1[0]: %d \n", int1[0]);
printf("int1[1]: %d \n", int1[1]);
free(int1); //동적 메모리 해제
return 0;
}
char *s1 = voidPtr(); // void 포인터를 char 포인터에 넣음
int *int1 = voidPtr(); //void 포인터를 int 포인터에 넣음
▲return 값 voidptr포인터를 char, int에 넣어줌
보통의 경우 포인터에 어떤 값의 주소를 넣어주지만, voidPtr이 malloc 동적 메모리가 할당된 것이므로 voidPtr 포인터의 주소를 넣어준 것이 아니라, 동적 메모리를 할당한 것으로 이해하자.
▼같이 공부하면 좋을 부분
'프로그래밍 언어 > C' 카테고리의 다른 글
visual studio 에서 C언어 개발 환경 구축하는 법 (0) | 2021.08.10 |
---|---|
C언어 35강) 구조체와 구조체 포인터 반환 (0) | 2020.11.24 |
C언어 33강)+ 함수에서 문자열 포인터 반환 (0) | 2020.11.21 |
C언어 18강)+ 포인터 변수 선언 (0) | 2020.11.21 |
C언어 33강) 함수에서 포인터 반환하기 (0) | 2020.11.20 |