就在我放松思考的时候,我对数组上下文中的指针有了相当的理解,我又一次在下面的程序中倒下了,我理解了数组arr
,arr
和&arr
在数量上是相同的,但在类型上是不同的,但我没能很好地掌握下面程序的输出。我试着把它形象化,但只成功了一部分。如果你能对这件事给出一个严格而详细的解释,这样像我这样的人就可以永远摆脱这种困惑,我将不胜感激。
在下面的程序中,我使用了一个“2D”数组demo[][2]
。我知道demo[]
将是一个大小为2的array of arrays
。我还知道单独使用的demo
将是(*)[2]
类型。但我仍然对以下内容感到茫然:
1)为什么&demo[1]
与demo[1]
相同?不是demo[1]
应该是第二个数组的地址吗?那么究竟是什么,为什么它和第二个数组的地址相同呢?
2)我知道第二个&demo[1]
和第四个是一样的,因为printf()
只是demo[1]
而已,但我用它来说明这一点,它怎么能等于第三个*(demo+1)
,即demo+1怎么能等于*(demo+1)?printf()
与demo[1]
相同是众所周知的,但是*(demo+1)
如何能等于demo+1
?“某物”怎么能等于“某物”的价值?
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]
,它等于一个bare&demo[1]
。这就是关键的洞察力-数组的第一个元素与数组本身位于内存中的同一位置,就像&demo[1][0]
的第一个成员与结构本身位于内存中的同一位置一样。打印demo[1]
和struct
时,不是打印指向数组和数组的指针;而是打印指向数组的指针和指向该数组第一个成员的指针。&demo[1]
是demo[1]
的第二个成员的地址。demo+1
是该成员本身(它是数组),但由于该成员是数组,因此其计算结果为指向其第一个成员的指针。如上所述,它的第一个成员必须与数组本身并置。不是说“something”等于“something”的值,因为当您在这样的表达式中使用数组时,它不会对数组本身求值。demo
是指向*(demo+1)
的指针,它是2demo[1]
的数组。所以它的类型是&demo[1]
。demo[1]
是2int
的数组。它的类型是int (*)[2]
。但是,当在表达式中使用时,如果它不是demo[1]
或int
运算符类型的主题,它将计算为指向其第一个成员的指针,该成员是int [2]
类型的值。&
是指向sizeof
的指针,其类型为int *
。