您的位置:首页 > 其它

关于二维数组和二维指针的相关问题

2009-03-26 14:04 232 查看
问题:

#include <stdio.h>

int main(void){

int **p;
int arr[10]; //suppose the address of the arr[10] is 0x1200;
int i;

for(i=0;i <10;i++)

{
arr[i] = (int)arr + i;
}

p = &arr;

p[8][3] = 12;

for(i=0;i <10;i++)

{
printf("%x,",arr[i]);
}

return 0;
}

1、错误在于p = &arr;改为p=(int**)arr或者p=(int**)&arr , vs2003下编译通过。

这个是一维数组名赋给二维指针错误,其实二维数组名赋给二维指针一样需要强转。如下:

二维数组名不能简单理解成二维的指针,int a[4][5]; a是二维数组的首地址,但它不是一个int **型的指针。int **p = a;这样赋值是错误的,用指针对二维数组的操作应该参考用指针数组(int * p[4])或者或者行指针((int *)p[4])的方式。

2、关于p[8][3] = 12;

p[8][3] --> *(*(p+8)+3) -->*(1208 +3) 因为这种形式,括号外是*,所以括号里面变成地址相加,步长就是数组成员的长度,整形占4个字节,所以变为->*1220 ->此即是arr[5];所以最后结果是

1200,1201,1202,1203,1204,12,1206,1207,1208,1209
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: