【发布时间】:2021-06-06 07:03:04
【问题描述】:
我不太记得在哪里[可能完全是错误的,因为我不记得确切的情况] 我想我在指针类型转换中遇到了一种情况,只是简单地对指针进行类型转换,就是取消引用它。但我不记得它发生的确切情况。
我知道事情以通常的方式运作的方式,例如:
int main()
{
int x=99;
void* p=&x;
int y= *(int*)p; //------------------------(1)
printf("%d\n",y);
}
我主要关心的是 (1) 形式的陈述。类型可能不像提到的那样具体。但是是否存在* 之前的(int *) 是可选的情况或情况? [我的意思是虽然(int *)之前的*可以省略,但LHS上的变量应该存储指针值。我想问的是,即使我省略*是什么情况,只使用指针的类型转换实际上给出了指针的数据内容]
虽然我将类型转换称为(int *),但可以假定为通用类型转换,我试图解释上下文。
有没有发生这种情况的情况?
PS:我昨晚睡不着,因为这个问题一直困扰着我......
【问题讨论】:
-
如果这是让你彻夜难眠的东西,那么你的生活一定很顺利!
-
@obe 不是真的
-
好的,很遗憾听到这个消息......无论如何,我不记得曾经看到过“通过类型转换取消引用”,但我已经多年没有使用 C 了,所以最好让更多的人(最近?)经验答案...
-
不,没有。
-
您不能取消引用
void*,因为void是不完整的类型,因此编译器不知道void有多少字节。因此,在取消引用void*之前,您必须将其转换为编译器知道它有多大的类型。(int*)是指向int的指针的强制转换,当然'*'将强制转换的结果取消引用到int。但是你必须确保你没有通过void*以避免严格的别名规则。 C11 Standard - §6.5 Expressions (p6,7)