3 回答

TA贡献1796条经验 获得超10个赞
在C语言中,所有指针类型的表示可能不同。所以,是的,int *
不同于void *
。可以很难(或不可能)找到能够说明这种差异的真实平台,但在概念层面,差异仍然存在。
换句话说,通常情况下,不同的指针类型具有不同的表示。int *
不同于void *
和不同double *
。就C语言而言,您的平台使用相同的表示形式void *
并且int *
只不过是巧合。
一些指针类型都要求有相同的表述语言状态,其中包括void *
主场迎战char *
,指向不同的结构类型,或者说,int *
和const int *
。但这些只是一般规则的例外。

TA贡献1833条经验 获得超4个赞
其他人已经充分解决了传递int *一个原型函数的情况,该函数具有固定数量的参数,这些参数需要不同的指针类型。
printf不是这样的功能。它是一个可变参数函数,因此默认参数升级用于其匿名参数(即格式字符串之后的所有内容),并且如果每个参数的提升类型与格式效应器所期望的类型不完全匹配,则行为未定义。特别是,即使 int *并且void *具有相同的表示,
int a;
printf("%p\n", &a);
有未定义的行为。
这是因为调用帧的布局可能取决于每个参数的确切具体类型。为指针和非指针类型指定不同参数区域的ABI已经在现实生活中发生(例如,Motorola 68000希望您尽可能地在地址寄存器和数据寄存器中的非指针中保持指针)。我不知道任何真实的ABI会分离不同的指针类型,但它是允许的,听到一个我也不会感到惊讶。
- 3 回答
- 0 关注
- 1184 浏览
添加回答
举报