对于void* 的理解

void* 是一个特殊的指针,它的意义为无类型指针,他可以被赋值为任意类型的指针,但是仅限当作一个指针使用。

void* 是不能直接被 * 访问地址的内容,因为还不知道具体要读多少个字节;而且void* 不能参与指针运算,比如

void func(void* array){
    printf("%d\n",array[0]);
}

这段代码通不过编译,会提示void类型不能被当作完整的类型来处理。因为array[i]的访问其实是 array+ i*sizeof(array),但是void类型属于无类型,它的sizeof的值应该是不能被编译器接受,所以编译器拿不到sizeof的值就访问不了。

【事实上输出void的sizeof()值为1】

所以void*的使用必须得先为他分配一个类型。

void* 作为变量使用:

    int b;
    void* num;
    
    b=3;
    num=&b;
    
    printf("%d\n",*(int*)num);
在num=&b 这一步之后,num的值是等于b的地址了,但是num本身并没有被表明为 int* ,所以在后续的printf的访问中,还是需要强制转换才能访问。


在函数形参中的使用:

看一下memCpy的代码:

void *memCpy(void *dest, const void *src, size_t n)
{
	if (NULL == dest || NULL == src || n < 0)
		return NULL;
	char *tempDest = (char *)dest;
	char *tempSrc = (char *)src;

	while (n-- > 0)
		*tempDest++ = *tempSrc++;
	return dest;	
}
这里的的形参是void*, 传进来的是一个一维数组的起始地址。这里并没有直接使用 dest[i]这种方式访问内容,而是先将void* 强制转换为char* 并赋值给 tempDest 才开始正常的数组访问。所以这里的 void* 我觉得更像是一个指针容器,可以接受任何类型的指针,然后进入函数之后再将其转换为需要的特定的类型。


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值