C언어 void*

(Void*에서 넘어옴)

1 개요[ | ]

void*
void pointer
void 포인터, 보이드 포인터
  • 자료형이 정해지지 않은 포인터
  • 본래의 자료형 정보는 없고 메모리 주소만 알 수 있음
  • 다차원 배열을 넘겨주는 용도로 많이 사용한다.
주소 정보만 받아서 원래의 배열로 재구성할 수 있다. (실습 2의 마지막 예시 참조)
단, 원래의 배열을 재구성하려면, 받는 쪽에서 자료형과 배열의 형태(크기)를 알고 있어야 한다.

2 실습 1[ | ]

제곱을 구하는 간단한 함수 square()를 구현하되, 인수의 자료형을 각각 int, int*, void*로 받는 경우를 생각해보자.

2.1 int[ | ]

#include<stdio.h>
int square(int n) {
    return n*n;
}
int main() {
   int x=10;
   printf("%d", square(x)); // 100
}
int 값 곱셈

2.2 int*[ | ]

#include<stdio.h>
int square(int* p) {
    return (*p)*(*p);
}
int main() {
   int x=10;
   printf("%d", square(&x)); // 100
}
int* (int 포인터) → int (int 값)에 접근하여 곱셈

2.3 void*[ | ]

#include<stdio.h>
int square(void* p) {
    return (*((int*)p))*(*((int*)p));
}
int main() {
   int x=10;
   printf("%d", square(&x)); // 100
}
void* (부정형 포인터) → int* (int 포인터) → int (int 값)에 접근하여 곱셈

3 실습 2[ | ]

이번에는 3×3 크기의 2차원 배열을 출력하는 간단한 함수 print()를 구현해본다.

3.1 int[][][ | ]

#include<stdio.h>
void print(int a[3][3]) {
    for(int i=0; i<3; i++) {
        for(int j=0; j<3; j++) printf("%d ", a[i][j]);
        printf("| ");
    }
}
int main() {
   int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
   print(arr); // 1 2 3 | 4 5 6 | 7 8 9 | 
}

3.2 int*[ | ]

#include<stdio.h>
void print(int* a) {
    for(int i=0; i<3; i++) {
        for(int j=0; j<3; j++) printf("%d ", *(a+i*3+j));
        printf("| ");
    }
}
int main() {
   int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
   print((int*)arr); // 1 2 3 | 4 5 6 | 7 8 9 | 
}

3.3 void*[ | ]

#include<stdio.h>
void print(void* a) {
    for(int i=0; i<3; i++) {
        for(int j=0; j<3; j++) printf("%d ", *((int*)a+i*3+j));
        printf("| ");
    }
}
int main() {
   int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
   print((void*)arr); // 1 2 3 | 4 5 6 | 7 8 9 | 
}
#include<stdio.h>
void print(void* a) {
    int (*b)[3] = a;
    for(int i=0; i<3; i++) {
        for(int j=0; j<3; j++) printf("%d ", b[i][j]);
        printf("| ");
    }
}
int main() {
   int arr[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
   print((void*)arr); // 1 2 3 | 4 5 6 | 7 8 9 | 
}

4 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}