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

posted @ 2022-07-26 19:51  好人~  阅读(561)  评论(0编辑  收藏  举报