略微加速

略速 - 互联网笔记

为何void类型指针不能复引用,却可以参与强制类型转换

2021-03-25 leiting (1581阅读)

标签 C/C++

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)能得到的数字。



链接:https://www.zhihu.com/question/450245850/answer/1791241363
北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3