void指针(void*)用法
0.void*简介
void*是一种特殊的指针类型,可用于存放任意对象的地址。
void *pv =&obj; // obj 可以是任意类型的对象
void指针pv只保存了对象obj的首地址,并不知道obj是什么类型,所以通过pv无法取出obj。但是如果我们指明obj的类型,我们就可以取出obj对象。例子如下:
#include <iostream>
using namespace std;
int main() {
int b = 1;
void *a = &b;
cout << a<<endl;
cout << (int*)a<<endl; // 输出与cout << a;一致
cout << *((int*)a); // 输出1。(int*)a将void指针强制转换为int类型,相当于指明了a为int型。
return 0;
}
1.void*作为函数形参
#include <stdio.h>
int void_test(void* data)
{
int num = 0;
num = *(int*)data; // (int*)的作用是将data当成一个int指针(强制类型转换)
printf("num = %d\n", num);
}
int main()
{
int val;
val = 123;
void_test(&val);
return 0;
}
// 将以上代码编译并运行,输出结果为:
// num = 123
2.void指针的加一操作
在ANSI中下面代码是错误的
void * pvoid;
pvoid++; //ANSI:错误
pvoid += 1; //ANSI:错误
GNU指定void *的算法操作与char *一致
void * pvoid;
pvoid++; //GNU:正确
pvoid += 1; //GNU:正确
为迎合ANSI标准,并提高程序的可移植性,我们可以这样编写实现同样功能的代码:
void * pvoid;
(char *)pvoid++; //ANSI:正确;GNU:正确
(char *)pvoid += 1; //ANSI:错误;GNU:正确
GNU和ANSI还有一些区别,总体而言,GNU较ANSI更“开放”,提供了对更多语法的支持。但是我们在真实设计时,还是应该尽可能地迎合ANSI标准。
其他
如果函数的参数可以是任意类型指针,那么应声明其参数为void *
典型的如内存操作函数memcpy和memset的函数原型分别为:
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
参考:https://www.cnblogs.com/geekham/p/4225993.html