有隐含的'&'将数组转换为指针时的计算?

时间:2017-07-16 16:19:10

标签: c arrays pointers casting

将数组转换为指针时是否存在隐式&计算? 在其他类型转换中,没有这样的&计算。

首先我们知道数组不是指针,尽管数组和指针有许多相同或类似的操作。

当我尝试这段代码时,我发现它们都有相同的输出:

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的指针。

但是在上面的代码中,没有与0x7fdb53402790instance相关联的值a,因此在投射时我们无法重新理解此值一个指针(因为根本没有这样的值可以重新理解)。

所以我想在将数组转换为指针时,会有一个隐含的 & 计算地址。我的理解是对的吗?

1 个答案:

答案 0 :(得分:1)

首先,没有必要专门进行 cast 以便将数组转换为指针。术语强制转换通常是指显式转换。数组到指针的转换通常是隐式执行的。

其次,数组到指针的转换不是"数组的值转换为指针"。数组到指针的转换按照自己的特殊规则工作。您确实可以将数组到指针转换视为&运算符的隐藏应用程序。但是,对于数组a,正确的应用程序不是&a,而是&a[0]。所以,当你做的时候

char a[10];
char *p = a;

最后一行可以看作等同于

char *p = &a[0];

(这是一个相当有缺陷的"循环"解释,因为运算符[]本身通过数组到指针转换工作,但重点是隐藏的&运算符是应用于数组的第一个元素,而不是整个数组。)

这意味着您的示例中的&(instance->a)并不能很好地表示数组到指针转换的工作方式,即使它恰好生成具有相同数值的指针。