【发布时间】:2013-05-13 07:14:12
【问题描述】:
就在我放松地思考我对数组上下文中的指针有一个公平的理解时,我再次面对下面的程序。我已经理解了数组arr、arr和@987654323的用法@ 大小相同,但类型不同,但我无法牢牢掌握以下程序的输出。我尝试将其可视化,但仅部分成功。如果您能对此给出严格而详细的解释,我将不胜感激这样一来,像我这样的人就可以永远摆脱这种混乱。
在下面的程序中,我使用了一个“二维”数组demo[][2]。我知道demo[] 将是一个大小为2 的array of arrays。我也知道单独使用的demo 将是@ 类型987654328@.我仍然对以下内容感到茫然:
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 怎么可能等于*(demo+1)? “某物”如何与该“某物”的价值相等?
3) 既然这证明我不是很聪明,我应该停止猜谜游戏,并请你就什么是类型以下:
&demo[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] 给出 83,第二个数组的一个元素。
标签: c pointers multidimensional-array pointer-arithmetic