【发布时间】:2017-07-16 16:19:10
【问题描述】:
将数组转换为指针时是否存在隐式& 计算?
其他类型的演员,没有这样的&计算。
首先我们知道数组不是指针,虽然数组和指针有很多相同或相似的操作。
当我尝试这段代码时,我发现它们都有相同的输出:
typedef struct _test_struct {
char a[10];
} test_t;
int main() {
test_t *instance = malloc(sizeof(test_t));
printf("%zu\n", sizeof(test_t));
printf("%p\n", instance);
printf("%p\n", (instance->a));
printf("%p\n", &(instance->a));
return 0;
}
// output is:
10
0x7fdb53402790
0x7fdb53402790
0x7fdb53402790
最后两行显示数组转换为指针的值与数组地址的值相同。
在我对强制转换的理解中,以不同的方式理解相同的值(可能会应用位扩展或截断)。例如,将int a = 0; 转换为指针(void *)a 实际上只是得到一个指向地址0 的指针。
但是在上面的代码中,0x7fdb53402790 没有与instance 或a 相关联的值,所以在进行转换时我们不能仅仅将这个值重新理解为一个指针(因为没有这样的价值完全可以重新理解)。
所以我猜当将数组转换为指针时,会有一个隐含的 & 地址 计算。我的理解对吗?
【问题讨论】:
-
@LưuVĩnhPhúc 谢谢
-
@Jean-FrançoisFabre 谢谢,我知道
&instance会给我一个不同的值(一个地址保存另一个地址),但我认为这与我的问题无关。 -
@LưuVĩnhPhúc "%p" 参数也应显式转换为 void*,否则......行为未定义。