【问题标题】:Is there an implicit '&' calculation when cast array to pointer?将数组转换为指针时是否存在隐式“&”计算?
【发布时间】: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 没有与instancea 相关联的值,所以在进行转换时我们不能仅仅将这个值重新理解为一个指针(因为没有这样的价值完全可以重新理解)。

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

【问题讨论】:

标签: c arrays pointers casting


【解决方案1】:

首先,不需要为了将数组转换为指针而专门进行强制转换cast 一词通常指的是显式 转换。数组到指针的转换通常是隐式执行的。

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

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

最后一行可以看成等价于

char *p = &a[0];

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

这意味着您的示例中的&(instance->a) 并不能很好地表示数组到指针的转换是如何工作的,即使它碰巧产生了一个具有相同数值的指针。

【讨论】:

  • 感谢您的回复。我已经基本明白了。但是为什么&a 不是一个合适的应用程序?这只是将整个数组视为一个元素并获取其地址,因此&a+1 会跳过整个数组(尽管这很少有用)。
  • @Buqian Zheng:数组到指针转换的结果是一个指向元素的指针。对于char a[10] 数组,数组到指针转换的结果应该是char * 类型。 &a 将提供一个指向整个数组的指针,即char (*)[10] 类型的指针。这就是为什么&a 不是一个很好的类比。 &a指针数值正确,但类型错误
猜你喜欢
  • 2022-08-24
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 2018-09-25
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多