2019年12月18日-关于void *

说到C就不得不提指针,指针和结构体两个东西是C语言的灵魂。而一提到指针,有一个比较特殊的,那就是void*。void*到底是怎样的存在?

  • 指针类型的含义
    在说明void*之前,先了解一下普通指针类型的含义。
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a[]={0x01020304,2019};
	int *b=a;
	char*c=(char*)&a[0];
	printf("b+1:%d\n",*(b+1));
	printf("c+1:%d\n",*(c+1));
	
	system("pause");
	return 0;
}

输出结果为
输出结果

同样是指针类型,b和c有什么区别?
一个是指向整型的指针,一个是指向char型的指针,当它们执行算术运算时,它们的步长就是对应类型占用空间大小

结论:各种类型的指针没有本质区别,只是解释内存中的数据方式不同。例如,对于int型指针b,该引用时,会解析4字节,算术运算时,也是以该类型占用空间大小为单位。所以b+1,移动4字节,解引用,处理4字节内容,得到2019。对于char型指针C,解引用时,会解析1个字节,算术运算时,也是以sizeof(char)为单位,所以c+1,移动一字节,解引用,处理1字节,得到03。

指针是对内存区域的抽象。指针变量中存放着目标对象的内存地址,而与指针相复合的类型,则说明了相应内存区域中的内容具有哪些属性,以及能做什么事情。也就是说,在内存空间某块区域中的内容,原本可以是不可解读的;但是,如果有一个描述这块区域的指针存在,我们就能找到它(地址的作用),并且合理地使用它(类型作用)。void*只用其中一半地作用。因为没有明确与指针相复合地类型,所以不能解引用,也不能使用基于类型之上(sizeof(T))的指针运算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值