问题:
#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