c - 将指针类型转换为 &(int*) 和 (int*)& 并将其分配给某个指针变量时有什么区别?
问题描述
如果我们有一个void
指针,并尝试将某个指针变量的地址分配给它(例如,指向 int 的指针),那么语句 1 和 2 之间有什么区别。
对于语句 2,我得到了lvalue error
,但我没有得到这背后的原因 -ptr
只是lvalue
为什么它显示错误?
int a;
int *ptr =&a ;
1. void *p =(int*)&ptr;
2. void *p=&(int*)ptr;
解决方案
根据 C99 规范的第 6.5.4 节,第 4 行,脚注 89,可在此处在线获取:
强制转换不会产生左值
当我们查看您的代码时:
int a;
int *ptr =&a ;
1. void *p =(int*)&ptr;
2. void *p=&(int*)ptr;
在 1 的情况下:为void
指针分配了已被类型转换为 的内容int*
。这是有效的。事实上,以下陈述也是有效的:
3. void *p = (int*)123;
4. void *p = (int*)a;
5. void *p = (int*)ptr;
但是如果 2:(int*)ptr
已成为一个右值,然后您正在使用&
该右值。它未能说明:lvalue required as unary '&' operand
对于 2.,void*
导致问题的不是分配,而是&
右值上的运算符。
推荐阅读
- node.js - 如何安装 node.js
- java - 如何在 KeyListener 中打印整个字符串?
- python - Windows 中的 Vim pymode
- c++ - 如何在变体容器上使用 stl 算法
- apache-kafka - Kafka Consumer 覆盖未提交消息的偏移量
- python - Pandas - Excel 浮点数解释错误
- google-apps-script - 比较电子表格内容
- java - 尝试将 TTF 文件加载到我的游戏中时出现读取字体数据错误的问题
- c# - 应用程序在 IIS 进程内运行,但未配置为使用 IIS 服务器 .Net Core 2.2
- ffmpeg - 我想用 ffmpeg 从不是 imd%04d 的文件名开始制作视频