1. void형 포인터
포인터에는 여러가지 형이 있다.
double*, int*, short*, 배열 포인터, 함수 포인터, 이중 포인터, …
그런데 아직 언급하지 않는 것이 있는데, 바로 void형 포인터다. void형 포인터 변수 역시 여느 포인터 변수와 마찬가지로 다음과 같이 선언된다.
void* ptr;
void의 사전적 의미는 공허 또는 빈곳이다. 즉 아무것도 없음을 의미한다.
그래서 반환값이 없는 함수의 반환형을 void로 쓰는 것이다.
그렇다면 void형 포인터는 아무것도 가리키지 않는 포인터일까?
2. 모든 것을 가리킬 수 있는 포인터
void형 포인터는 아무것도 가리키지 않는 포인터가 아니다. 오히려 모든 것을 가리킬 수 있는 포인터다. int형 변수, double형 변수, 심지어는 함수까지 가리킬 수 있다. 이는 void형 포인터 변수에 가리키는 대상에 대한 정보가 담기지 않기 때문이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <stdio.h>
int add(int a, int b);
int main()
{
int num = 25;
int a = 5, b = 9;
void* ptr;
ptr = #
printf("%p\n", ptr);
ptr = add;
printf("%p\n", ptr);
return 0;
}
int add(int a, int b)
{
return (a + b);
}
|
cs |
void형 포인터 변수는 가리키는 대상에 대한 정보를 담지 않기 때문에 무엇이든 가리킬 수 있지만, 그 외에 것은 아무것도 못 한다. 가리키는 대상에 대한 정보가 없기 때문에 어떠한 포인터 연산도 할 수 없다. 주소를 통해 값을 읽어오는 것도, 연산도 불가능하다는 것이다.
따라서 위 예제를 다음과 같이 바꾸면 에러가 발생한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <stdio.h>
int add(int a, int b);
int main()
{
int num = 25;
int a = 5, b = 9;
void* ptr;
ptr = #
printf("num: %d\n", *ptr);
ptr = add;
printf("%d + %d = %d\n", ptr(a, b));
return 0;
}
int add(int a, int b)
{
return (a + b);
}
|
cs |
가리키는 대상에 대한 정보가 없어 int형 변수를 가리키는지, double형 변수를 가리키는지, 아니면 함수나 배열을 가리키는지 알 수 없다. 따라서 12행과 같이 주소를 통해 값을 참조하는 것도, 15행과 같이 함수를 호출하는 것도 불가능하다.
그래서 void형 포인터는 우선 주소값을 저장하고, 포인터 형은 나중에 결정할 때 사용된다.
포인터 형은 강제 형 변환(casting 연산)에 의해 정해진다.
'Programming > C' 카테고리의 다른 글
문자 입출력 함수 (0) | 2019.05.05 |
---|---|
스트림 (0) | 2019.05.01 |
함수 포인터 (0) | 2019.04.10 |
2차원 배열과 포인터 (0) | 2019.04.09 |
다차원 배열 (0) | 2019.04.01 |