正当我放松地认为我对数组上下文中的指针有了一个公平的理解时,我在接下来的程序中再次陷入低谷。我已经理解了数组arr、arr和&arr在大小上是相同的,但是类型不同,但我没有对下面程序的输出有一个坚实的把握。我试图将它可视化,但只取得了部分的成功。如果你能对这件事给出一个严格而详细的解释,我会很感激,这样像我这样的人就能很好地解决这个困惑。
在下面的程序中,我使用了一个"2D“数组demo[][2].I知道demo[]将是大小为2的array of arrays,我还知道单独使用的demo将是(*)[2].Still类型,我对以下内容感到困惑:
1)为什么&demo[1]和demo[1]相同?demo[1]不应该是第二个数组的地址吗?&demo[1]到底是什么?为什么与第二个数组的地址相同?
2)我知道第二个printf()和第四个是相同的,因为demo[1]只是*(demo+1).But,所以我用它来说明point.How是否等于第三个printf(),即demo+1如何等于*(demo+1)E 223?d24与*(demo+1)相同是众所周知的,但是demo+1如何等于*(demo+1)?E 128如何才能“某物”等于“某物”的值>E 229。
3) --因为它刚刚证明了我不是很聪明,我应该停止我的猜测游戏,问你一个关于类型是什么的结论性的答案:
&demo1 1
demo1
demo+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发布于 2013-05-13 07:28:43
demo[1]是数组demo的第二个成员,也是一个数组本身。与任何其他数组一样,当它不是&或sizeof操作符的主题时,它将计算为指向其第一个元素的指针--也就是说,demo[1]的计算结果与&demo[1][0]相同,&demo[1][0]是数组demo[1]中第一个int的地址。
&demo[1]是数组demo[1]的地址,因为数组的地址和该数组的第一个成员的地址必然是相同的位置,所以&demo[1]等于&demo[1][0],后者等于裸demo[1]。这是关键的洞察力-数组的第一个元素与数组本身在内存中的位置相同,就像struct的第一个成员与结构本身在内存中的位置一样。打印&demo[1]和demo[1]时,不是要打印指向数组和数组的指针,而是要打印指向数组的指针和指向数组的第一个成员的指针。
demo+1是demo的第二个成员的地址。*(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]。https://stackoverflow.com/questions/16516620
复制相似问题