说到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))的指针运算。