将数组转换为指针时是否存在隐式&
计算?
其他类型的强制转换,没有这样的&
计算。
首先我们知道数组不是指针,尽管数组和指针有很多相同或相似的操作。
当我尝试这段代码时,我发现它们都有相同的输出:
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 的指针。
但是在上面的代码中,没有与 instance
或 a
关联的值 0x7fdb53402790
,因此在进行转换时我们无法只需将这个值重新理解为指针(因为根本没有这样的值需要重新理解)。
所以我猜当将数组转换为指针时,存在隐式的&
地址计算。我的理解对吗?
最佳答案
首先,不需要专门进行转换来将数组转换为指针。术语强制转换通常指显式转换。数组到指针的转换通常是隐式执行的。
其次,数组到指针的转换不是“数组的值转换为指针”。数组到指针的转换按照其自身的特殊规则进行。您确实可以将数组到指针的转换视为 &
运算符的隐藏应用。然而,对于数组 a
来说,正确的应用不是 &a
,而是 &a[0]
。所以,当你这样做时
char a[10];
char *p = a;
最后一行可以看作等同于
char *p = &a[0];
(这是一个相当有缺陷的“循环”解释,因为运算符 []
本身通过数组到指针的转换来工作,但重点是隐藏的 &
运算符应用于数组的第一个元素,而不是整个数组。)
这意味着示例中的 &(instance->a)
并不能真正很好地表示数组到指针的转换如何工作,即使它碰巧生成了一个带有相同的数值。
关于c - 将数组转换为指针时是否存在隐式 '&' 计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45130767/