본문 바로가기

void형 포인터

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 = &num;
    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 = &num;
    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