프로그래밍 언어/C

C언어 34강) void 포인터 개념 및 void 포인터 반환

happy_life 2020. 11. 22. 22:34

void 포인터 개념

int *numPtr ; 등은 자료형이 정해진 포인터이다. 자료형이 정해지지 않은 포인터도 있는데 이를 void 포인터라 부른다.

 

 

void포인터 코드 예제

#include <stdio.h>

int main()
{

    int num = 6;

    int *numPtr = &num; //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 expression 오류

 

 

 

 

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언어 33강) 함수에서 포인터 반환하기

함수 return 값으로 지금까지 1 , 3.3 등의 값을 가져왔다. 그렇다면 포인터(메모리 주소)를 return 하려면 어떻게 해야 할까? ●포인터 반환 함수 문법 반환값자료형 *함수이름() { return 반환값; } 코드

abcdefgh123123.tistory.com

포인터 반환 활용 -문자열 포인터 반환

 

C언어 33강)+ 함수에서 문자열 포인터 반환

문자열 포인터 기본 C언어 18강)++ 포인터와 문자열/ 문자열 포인터에서 인덱스로 접근하기 C언어에는 문자열을 직접 선언하는 방법이 없다. 따라서 배열이나 포인터를 사용해 문자열을 처리한다

abcdefgh123123.tistory.com