关于指针数组
int main() { int a[3][3],*p,i; p=&a[0][0]; for(i=0;i<9;i++) p[i]=i; for(i=0;i<3;i++) printf("%d",a[1][i]); return 0;} #include <stdio.h>int main() { int a[3][3]; int* p; int i; p=&a[0][0]; for(i=0; i<9; i++) { //p[i] = i; //这条语句实现赋值,与*(p+i) = i;等同 *(p+i) = i; } for(i=0;i<3;i++) { printf("%d", a[1][i]); //表示输出第1行,第0,1,2列的值:345 } return 0;}
[解决办法]
数组是一段连续分配的内存空间,p=&a[0][0];你让指针指向了这段连续空间的首地址,之前你声明的int* p 完全可以看成是一个一维数组,p[i]=i;也就是说你把二维数组看成了一维数组并进行了赋值 ,所以你输出的时候就是i
[解决办法]
p[i]=i //这句并不是修改数组的地址,而是给数组赋值。二楼的第一个注释揭露了本质。
自从你将:p=&a[0][0] ,这与p=a 或是p=&a[0]都是同一个意思。
[解决办法]
#include <stdio.h>int main() { int a[3][3]; int *p; int i; p=&a[0][0];// p=a; for(i=0;i<9;i++) p[i]=i; //*(p+i)=i; °Ñi¸³Öµ¸øp[i] p[0]=a[0][0] p[1]=a[0][1] p[2]=a[0][2] p[3]=a[1][0] p[4]=a[1][1] p[5]=a[1][2] p[6]=a[2][0] //p[7]=a[2][1] p[8]=a[2][2] for(i=0;i<3;i++) printf("%d",a[1][i]); return 0;}
[解决办法]
而 p[i]这种写法,相当于*(p+i),就是指向a数组中的第i个元素(因为a数组虽然是2维的,但是连续存放,)
比如*(p+3)等价于a[1][0]
所以p[i]=i; 这句,就是给a数组赋值
然后下面就是输出了