比如:
a[3][4]是一个二维数组,
怎么定义一个指针p,使得它能替代数组名a?
比如对于访问一个元素,如果用数组名,可以这样:*(*(a+i)+j)
怎么定义然后赋值使得p 也可以这样取数据:*(*(p+i)+j)
?========================
定义a为二维数组后,有三种成份:数组本身、3个一维数组(a的每一行对应一个一维数组)、12个数组元素,由此就有三种指针及对应的指针变量,&a和int (*p1)[3][4](没有实用意义)、&a[i]和int (*p2)[4](当i为0时,@a[0]可简化为a)、a[i][j]和int *p3;
由于指针类型匹配是完全匹配,所以初始化形式必须严谨。
上面有人写出
int (*p)[4]=&a;
则是类型不匹配,指向一维数组的指针变量指向了二维数组,尽管有些编译器只给warning、尽管有人认为指针值(二维数组a和一维数组a[0]的地址值)是相同的,事实是类型不匹配、错误
还有人写出
int *p = &a[0][0];/*或者int *p = a[0];*/
这个指针变量是指向数组元素的,没有了数组结构信息,因此用该指针变量访问数组元素时,只能再提供列数信息进行地址计算:
*(p+i*列数+j)
结论是
int (*p)[4]=a;/*或者int (*p)[4]=&a[0]*/
是严格指针类型匹配的,且p具有数组结构信息(列数),可以直接访问数组元素
*(*(p+i)+j)等价于a[i][j]
提供一个小“伎俩”供分析用:指针(变量)左边一个*可等效替换为右边一个[],两个*可等效替换为。。。
a[3][4]是一个二维数组,
怎么定义一个指针p,使得它能替代数组名a?
比如对于访问一个元素,如果用数组名,可以这样:*(*(a+i)+j)
怎么定义然后赋值使得p 也可以这样取数据:*(*(p+i)+j)
?========================
定义a为二维数组后,有三种成份:数组本身、3个一维数组(a的每一行对应一个一维数组)、12个数组元素,由此就有三种指针及对应的指针变量,&a和int (*p1)[3][4](没有实用意义)、&a[i]和int (*p2)[4](当i为0时,@a[0]可简化为a)、a[i][j]和int *p3;
由于指针类型匹配是完全匹配,所以初始化形式必须严谨。
上面有人写出
int (*p)[4]=&a;
则是类型不匹配,指向一维数组的指针变量指向了二维数组,尽管有些编译器只给warning、尽管有人认为指针值(二维数组a和一维数组a[0]的地址值)是相同的,事实是类型不匹配、错误
还有人写出
int *p = &a[0][0];/*或者int *p = a[0];*/
这个指针变量是指向数组元素的,没有了数组结构信息,因此用该指针变量访问数组元素时,只能再提供列数信息进行地址计算:
*(p+i*列数+j)
结论是
int (*p)[4]=a;/*或者int (*p)[4]=&a[0]*/
是严格指针类型匹配的,且p具有数组结构信息(列数),可以直接访问数组元素
*(*(p+i)+j)等价于a[i][j]
提供一个小“伎俩”供分析用:指针(变量)左边一个*可等效替换为右边一个[],两个*可等效替换为。。。