将数组转换为指针时是否存在隐式&
计算?
在其他类型转换中,没有这样的&
计算。
首先我们知道数组不是指针,尽管数组和指针有许多相同或类似的操作。
当我尝试这段代码时,我发现它们都有相同的输出:
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
,因此在投射时我们无法重新理解此值一个指针(因为根本没有这样的值可以重新理解)。
所以我想在将数组转换为指针时,会有一个隐含的 &
计算地址。我的理解是对的吗?
答案 0 :(得分:1)
首先,没有必要专门进行 cast 以便将数组转换为指针。术语强制转换通常是指显式转换。数组到指针的转换通常是隐式执行的。
其次,数组到指针的转换不是"数组的值转换为指针"。数组到指针的转换按照自己的特殊规则工作。您确实可以将数组到指针转换视为&
运算符的隐藏应用程序。但是,对于数组a
,正确的应用程序不是&a
,而是&a[0]
。所以,当你做的时候
char a[10];
char *p = a;
最后一行可以看作等同于
char *p = &a[0];
(这是一个相当有缺陷的"循环"解释,因为运算符[]
本身通过数组到指针转换工作,但重点是隐藏的&
运算符是应用于数组的第一个元素,而不是整个数组。)
这意味着您的示例中的&(instance->a)
并不能很好地表示数组到指针转换的工作方式,即使它恰好生成具有相同数值的指针。