gpt4 book ai didi

c - 将数组转换为指针时是否存在隐式 '&' 计算?

转载 作者:行者123 更新时间:2023-11-30 19:08:27 25 4
gpt4 key购买 nike

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

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

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

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

但是在上面的代码中,没有与 instancea 关联的值 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com