gpt4 book ai didi

c - 对于 "int demo[4][2]",为什么它们的大小都相同 : &demo[1], demo[1],demo+1,*(demo+1) ?类型呢?

转载 作者:太空宇宙 更新时间:2023-11-04 02:56:43 26 4
gpt4 key购买 nike

就在我放松下来以为我对数组上下文中的指针有一个公平的理解时,我对下面的程序再次感到沮丧。我已经理解了数组 arr,arr&arr 大小相同,但类型不同,但我无法牢牢掌握以下程序的输出。我尝试将其可视化,但仅部分成功.如果你能对这件事给出一个严谨而详细的解释,我将不胜感激,这样像我这样的人就可以永远摆脱这种困惑了。

在下面的程序中,我使用了一个“二维”数组demo[][2]。我知道demo[] 将是一个数组大小为 2 的数组。我也知道 demo 单独使用的类型是 (*)[2]。我仍然对以下:

1) 为什么&demo[1]demo[1]一样?demo[1] 应该是第二个数组的地址?&demo[1] 到底是什么,为什么和第二个数组的地址一样?

2) 我知道第二个 printf() 和第四个是一样的,因为 demo[1] 只不过是 *(demo+1)。但是我用它来说明这一点。它怎么能等于第三个printf(),即怎么能demo+1 等于*(demo+1)demo[1]*(demo+1) 是众所周知的,但是demo+1 怎么能等于*(演示+1)“某物”如何等于该“某物”的值(value)

3) 既然证明了我不是很聪明,那我也该停止猜谜了,请你给个结论性的答案,什么是类型以下:

&演示[1]
演示[1]
演示+1

#include<stdio.h>

int main(void)
{
int demo[4][2]= {{13,45},{83,34},{4,8},{234,934}};
printf("%p\n",&demo[1]);
printf("%p\n",demo[1]); //Should have cast to (void*),but works still
printf("%p\n",demo+1);
printf("%p\n",*(demo+1));
}

输出:

0023FF28
0023FF28
0023FF28
0023FF28

最佳答案

demo[1]是数组 demo 的第二个成员, 并且本身就是一个数组。就像任何其他数组一样,当它不是 & 的主题时或 sizeof运算符,它计算为指向其第一个元素的指针 - 即 demo[1]计算结果与 &demo[1][0] 相同, 第一个的地址 int在数组中 demo[1] .

&demo[1]是数组的地址 demo[1] ,并且因为数组的地址和该数组的第一个成员的地址必然位于同一位置,&demo[1]等于&demo[1][0] ,等于一个裸demo[1] .这是关键的见解 - 数组的第一个元素与数组本身位于内存中的同一位置,就像 struct 的第一个成员一样。与结构本身位于内存中的同一位置。当你打印 &demo[1]demo[1] ,您没有打印指向数组的指针和数组;您正在打印指向数组的指针和指向该数组第一个成员的指针。

demo+1demo的第二个成员的地址. *(demo+1)是该成员本身(它是数组 demo[1] ),但因为该成员是一个数组,所以它计算为指向其第一个成员的指针。如上所述,它的第一个成员必须与数组本身并置。这并不是说“某物”等于“某物”的值 - 因为当您在这样的表达式中使用数组时,它不会计算为数组本身。

  • &demo[1]是指向 demo[1] 的指针, 这是一个数组 2 int .所以它的类型是int (*)[2] .
  • demo[1]是 2 int 的数组.它的类型是 int [2] .但是,当用于不是 & 类型主语的表达式中时或 sizeof运算符,它将评估指向其第一个成员的指针,这是一个类型为 int * 的值.
  • demo+1是指向 demo[1] 的指针, 它的类型是 int (*)[2] .

关于c - 对于 "int demo[4][2]",为什么它们的大小都相同 : &demo[1], demo[1],demo+1,*(demo+1) ?类型呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16516620/

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