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

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

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

相关文章:

c - CLAPACK 中的四元数或替代 C 样式四元数库

python - 使用 PyQT 在 Python 中将二维整数数组重写为位图

c++ - 交换指针

c# - 一种更快的反转字符串的方法?

c - 为什么 "string"在标准C库函数名中缩写为 "a"?

c - printf 重新定义 UINT32_MAX

c - 如何在c中的字符数组中用strtok划分单词

函数错误的冲突类型

c - 使用WELL512获取一定范围内的随机实数

arrays - 基于对在 MATLAB 矩阵中添加值