在gcc编译器中,下面程序的运行结果是()
#include<stdio.h>
int main(void)
{
int x[5] = {2,4,6,8,10},*p;
int (*pp)[5];
p=x;
pp=&x;
printf ("%d\n",*(p++));
printf ("%d\n",*pp);
}
超容易理解:我总结一下这一题出现的问题:
1、第一种理解方式。首先x是数组名,也就是我们熟知的数组的首元素地址 ,即&x[0];
其次得知道&x;代表的是整个数组的地址。
当pp操作时,相当于 *(&x),该表达式的结果自然就是x。而我说过,x是什么,数组名,首元素的地址。所以,对一个地址以整型格式打印,就是将地址转为整数。而每次分配一个数组,它的首元素地址就是不一样的。所以是随机值。
2、第二种理解方式。首先得知道什么是行地址和列地址。对于一个数组而言,第一个元素的地址既是整个数组的一行的地址标识,也是每个元素第一个列的地址标识。所以正确理解pp的含义是,pp是行地址,而*pp得到列地址,也就是第一列的地址(数组首元素的地址)。
注意:这里得知道行地址如何转为列地址,也就是*行地址 == 列地址。
#include<stdio.h>
int main(void)
{
int x[5] = {2,4,6,8,10},*p; int (*pp)[5];
p=x;
pp=x;
printf ("%p\n",p);
printf ("%p\n",pp);
printf ("%d\n",*(p++));
printf ("%d\n",*pp);
}
0x7fff5150e210 0x7fff5150e210 2 1364255248实际上地址相同,但是出于如何解释地址上的数据,*pp的结果为大小为5的int数组。