void*这种指针类型,是给你用来自己骗自己的。
一个东西被定义成void*,有两个目的:
1、你不能直接对void*指向的地址进行读写操作。
2、它可以直接接受所有类型的指针直接赋值。
你把一个void*转换为任意指针或类型,例如:
void* p = NULL;
int *n=(int*)p;
上面这一行代码,实际上只是在欺骗编译器,程序运行的时候,这一行代码实际上什么都没有做。
如果你在这之后,利用n来访问内存,编译器才会根据n的指针类型大小去计算offset,然后再编译成相关的指令去执行。
例如:
n[100]=100;
会被编译成大概如下的汇编指令(intel x86):
mov eax,64h
mov [ecx+190h],eax
64h是16进制数字,也就是10进制的100,
190h就等于64h*4,也就是400
ecx为n的地址
乘数4,就是int的类型大小,也就是你用sizeof(int)能得到的数字。
最新评论: