본문 바로가기
c언어

c언어 void 포인터에 대하여 알아보기

by 개발자 L 2023. 2. 10.
반응형

c언어 void 포인터에 대하여 알아보기

네 안녕하세요, 이번 포스팅에서는 void 포인터에 대하여 알아보도록 하겠습니다.

우리가 프로그래밍 언어를 사용할 때 항상 보면 무언가 값을 받죠?
하지만 간혹 그러지 않는 경우도 있습니다.

그럴 때 이 포인터를 쓰는데,

그래서 이 void 포인터가 무엇이며, 사용법은 어떻고, 어떤 기능을 하는지 알아보도록 하겠습니다.

 

1. void 포인터의 사용 방법

void 포인터는 받아야 하는 값이 구체적으로 정해져 있지 않은 경우에 씁니다.

하지만 이렇다고 하여 명시되어 있는 값만 없을 뿐,

순수 메모리의 주소는 가지고 있습니다.

이러한 포인터를 void 포인터라고 하며, 사용 방법은 이렇습니다.

void *p;

선언 방법은 앞에 'void'만 붙이면 됩니다.

그렇지만 포인터가 정확히 어떤 것을 가리킬 지는 정해져 있지 않기 때문에

에스터리스크를 이용하여 연산을 할 수는 없습니다.

위 포인터로 연산을 하고자 한다면,

반드시 위 포인터가 어떤 대상을 가리키도록 캐스팅(형 변환)을 해주어야 합니다.

이런 식으로 말이죠.

int a = 10;
void *p;

p = &a;

printf("%d", *p); // void 포인터가 대상을 가리키는 포인터가 아니므로 오류가 남.
printf("%d", *(int *)p); // 무조건 캐스팅을 시켜야만 가능함.
반응형

 

2. void 포인터의 장점

이 쯤 되면 우리가 무언가 받아야 할 때 캐스팅을 해야 하고,

값이 정해져 있지 않아서 별 가치가 없다 생각을 할 수도 있어서 왜 이걸 쓰는지 궁금하실 수도 있다고 생각합니다.

하지만 명백한 장점이 있습니다.

'void'이기 때문에 자료형이 명시적으로 정해져 있지 않다고 그랬었죠?
그렇기 때문에 어떠한 타입의 포인터도 받을 수 있는 함수를 만들 수 있습니다.

예를 들어서 전달을 받은 메모리를 0으로 모두 채우는 함수가 있다고 가정을 해봅시다.

그러면 void 포인터를 받아서 문자열로 캐스팅을 시켜주고 그 포인터가 가리키는 곳에 0을 저장하면 되겠죠?
오히려 코드를 작성할 때 보면 어떤 값을 받아야 하나 확실히 정하고 하지 않는 경우도 다수이기 때문에

오히려 void 포인터를 쓰는 것이 편할 수 있습니다.

그 상태에서 나중에 완성이 된 코드에서 포인터의 자료형만 바꿔주면 되는 것이죠.

그럼 void 포인터를 이용한 예제 코드를 한 번 작성을 해보도록 하겠습니다.

#include <stdio.h>

void memzero(void *ptr, size_t len);

int main()
{
    char a[10];
    memzero(a, sizeof(a));

    char b[10];
    memzero(b, sizeof(b));

    char c[10];
    memzero(c, sizeof(c));

    return 0;
}

void memzero(void *ptr, size_t len)
{
    char *p = ptr;

    for(; len > 0; len--)
    {
        *p++ = 0;
    }
}

이렇게 작성을 하고 코드를 실행을 하면 결과는 크게 나오는 것이 없습니다.

그냥 에러 없이 터미널이 종료되면 잘 된 것입니다.

 

여기까지 vioid 포인터에 대하여 알아보았는데요,

다음 포스팅에서는 main 함수의 인수들에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다~

반응형

댓글