由于void* 可以被任何指针赋值,所以以void*作为函数参数可以使得接口更容易接受不同类型的参数,不过需要注意的时,实际操作时还需要利用强制类型转换,将指针转换为原类型,否则在内存上会有问题。
    一般情况下void*不支持解引用,同样不支持运算。(因为无法清楚知道所指地址的对象占用了多大的内存)以下为数组指针的一些总结(T可参考int)
| 表达式 | a指针指向 | 解释 | 维数 | 数组中元素类型 | 
|---|---|---|---|---|
| T* a; | T* | 指向整数的指针 | 1维 | 整数指针 | 
| T a[m]; | T(*) | 指向整数数组头 | m维 | 整数 | 
| T* a[m]; | T* (*) | 指向整数的指针数组 | m维 | 指针->整数 | 
| T a[m][n] | T(*)[n] | 指向整数数组的指针数组 | m维 | 指针->整数数组 | 
下面考虑函数调用void*参数再转化为数组指针的几个例子:
#include <iostream>
using namespace std;
int f1(void* arg){
    int* a1=(int*)arg;
    return *a1;
}
int f2(void* arg){
    int* b1=(int *)b1;
    return b1[0];
}
int f3(void* arg){
    int** d1=(int **)arg;
    return *d1[0];
}
int f4(void* arg){
    int(*c)[2]=(int(*)[2])arg;
    return c[0][0]; 
}
int main(int arg,char* argv[]){
    int a=1;
    int e=5;
    int b[2]={1,2};
    int* d[2]={&a,&e};
    int c[2][2]={1,2,3,4};
    cout<<f1(&a)<<"\n"<<f2(b)<<"\n"<<f3(d)<<"\n"
        <<f4(c)<<endl;
    return 0;
}
//最后的输出为1,9,5,4原文:https://www.cnblogs.com/caculas22/p/void_pointer.html