gpt4 book ai didi

将数组的地址转换为其他数据类型

转载 作者:太空狗 更新时间:2023-10-29 16:43:49 24 4
gpt4 key购买 nike

int main()
{
char arr[5][7][6];
char (*p)[5][7][6] = &arr;
printf("%d\n", (&arr + 1) - &arr);
printf("%d\n", (char *)(&arr + 1) - (char *)&arr);
printf("%d\n", (unsigned)(arr + 1) - (unsigned)arr);
printf("%d\n", (unsigned)(p + 1) - (unsigned)p);

return 0;
}

当我运行上面的代码时,我得到以下输出:

 1
210
42
210

为什么在每种情况下输出都不是 1

最佳答案

好吧,如果我想分开头发:首先,代码在整个 printf() 语句中到处调用未定义的行为。两个指针的差异类型为 ptrdiff_t,为此,正确的转换说明符是 %td,而不是 %d

剩下的只是猜测。假设您的系统是合理的,并且数值上指针值&arr 总是相同的,无论它被转换成什么类型​​。

现在,(&arr + 1) - &arr 是1,当然,根据指针运算规则。 (两个指针之间的实际差异是 210 * sizeof(int) 字节,但这不是学校数学而是指针算术,这就是为什么结果以大小为单位给出的原因 sizeof(T ),其中 T 是指针的基类型。)

然后 (char *)(&arr + 1) - (char *)&arr 将指针转换为 char *,并且由于 char< 的大小 是 1,这将打印差异以字节为单位;您在这里实际上是在欺骗/滥用指针算法。

此外:printf("%d\n", (unsigned)(arr + 1) - (unsigned)arr) 正在减去两个 int (*)[7 ][6]。这就是 arr 衰变的结果。当然,7 * 6 = 42,所以 arr + 1arr 的大小差是 42 个元素。

但是,

p 不是指向数组第一个元素的指针,而是指向数组本身的指针。它的类型正确地表示为 int (*)[5][6][7]。现在,如果您使用该类型 打印差异,但您不让编译器通过将其误认为指针只是unsigned 来进行除法,那么您将得到5 * 6 * 7,即 210。

关于将数组的地址转换为其他数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17678448/

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