关于C语言中地址与指针类型的两个技术疑问
嘿,咱们一个个来拆解你的问题,都是C语言指针里的核心知识点,问得挺到位的~
问题1:关于&运算符的理解是否正确?
你的理解完全正确!再把这个逻辑掰碎了说清楚:
&是「取地址运算符」,它作用在变量上时,返回的就是该变量在内存里的起始地址,而且这个地址的类型是指向该变量类型的指针——比如你例子里x是int型,那&x的类型就是int*,完全对应。- C语言里指针赋值的核心规则就是类型匹配:只有同类型的指针(或者万能的
void*)才能直接接收这个地址。要是你用char* p = &x;这种不同类型的指针去接,编译器会直接给你抛警告(除非你强制转类型)——为啥?因为不同类型的指针解引用时,操作的内存大小不一样:int*解引用会读4字节(假设系统里int是4字节),char*只会读1字节,乱转的话肯定会搞出内存访问错误。
问题2:void*返回值的运作过程
先再敲一遍你自己也知道的警钟:绝对别返回局部变量的地址!函数执行完之后,栈上的局部变量会被销毁,返回的地址就成了「野指针」,后续访问会触发未定义行为,这个坑一定要绕开!
回到你的核心疑问:当你把&k(类型是int*)赋值给void* ptr,再返回这个ptr时,到底发生了啥?
其实就是一个隐式类型转换的过程,分三步看:
&k的类型是int*,当你把它赋值给void*变量时,编译器会自动把int*转换成void*——这个转换是安全的,因为void*就是设计来存任意类型内存地址的,它只记录地址本身,不带任何类型信息。- 函数返回
ptr的时候,本质上就是把这个存储了k地址的void*值(其实就是一个整数,32位系统是4字节,64位是8字节)直接传递给调用者,没有额外的内存操作。 - 调用者要是想用这个返回值,必须显式把
void*转回到原来的类型(比如int* p = (int*)foo();),不然没法正确解引用——因为void*本身不知道要访问多少字节的内存,必须转成具体类型的指针才行。
内容的提问来源于stack exchange,提问作者Zeroslade
相关产品推荐
相关产品推荐

