main() { int a[3][3],*p,i; p=&a[0][0]; for(i=0;i<9;i++) *(p+i)=i+1; printf("%d \n",a[1][2]); }

参考答案为:6,为什么?

main()
{int a[3][3],*p,i;//定义一个数组,定义一个指针和一个计数变量
p=&a[0][0];//让p指向a数组的第一个元素,&表示取地址运算,获得一个变量的地址。因为数组名也是指向数组第一个元素的指针,所以这句话也可以用p=a;来替换
for(i=0;i<9;i++)//循环9次,循环体是p[i]=i+1;p[i]其实和*(p+i)是一样的。也就是说这里其实就是用一个一维数组表示了一个二维数组。
p[i]=i+1;
printf("%d\n",a[1][2]);}
//输出结果是6;这里主要的知识是数组知识。数组不管是几维,在内存中都是一维的,这么说,二维数组可以认为是这样一种一维数组,而这个一维数组的每一个元素都是一维数组,就是这样。以2维数组为例,数据其实是按a[0][0],a[0][1],a[0][2],。。。。a[2][2]存储的。另外数组名也是指针,指向数组的第一个元素,数组括号里面的数就是从首地址偏移的位置。a[3]=*(a+3)就是这个意思。所以p[i]=*(p+i);也就是从a[0][0]偏移i个元素。而数组元素按照之前所说顺序进行排列。所以可以得出a[1][2]是第6个元素,也就是从a[0][0]偏移了5(a[0][0]是第一个元素),所以a[1][2]=*(p+5);p[5]=5+1=6;所以a[1][2]=6.不明白可追问。
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2018-03-29
#include <stdio.h>
main()
{
int a[3][3],*p,i;
p=&a[0][0];
for(i=0;i<9;i++)
*(p+i)=i+1;
printf("%d \n",a[1][2]);
}
其中p=&a[0][0]; 就是取二维数组的首地址(二维数组占用的内存空间是线性的)
for(i=0;i<9;i++) *(p+i)=i+1; 就是给这个二维数组赋值,也就是
a[0][0]=0+1,a[0][1]=1+1,a[0][2]=2+1,a[1][0]=3+1,a[1][1]=4+1,a[1][2]=5+1。。。。。。
所以答案是6本回答被提问者和网友采纳
第2个回答  2011-06-22
for(i=0;i<9;i++)
*(p+i)=I+1;
将二维数组看作一维数组,a[1][2]即相当于a[5]
*(p+0)=1 即a[0]=1
*(p+1)=2 即a[0]=2
*(p+2)=3 即a[0]=3
*(p+3)=4 即a[0]=4
*(p+4)=5 即a[0]=5
*(p+5)=6 即a[0]=6
相似回答