对于二维数组int a[][4]来说。。有以下要点:
1、
表示形式 含义 结果(举例) 备注
a 二维数组名,指向一维数组a[0],即0行首地址 2000 行指针
a[0],*(a+0),*a 0行0列元素的地址 2000 列指针
a+1,&a[1] 1行首地址 2016 行指针
a[1],*(a+1) 1行0列元素a[1][0]的地址 2016
a[1]+2,*(a+1)+2,&a[1][2] 1行2列元素a[1][2]的地址 2024
*(a[1]+2),*(*(a+1)+2),a[1][2] 1行2列元素a[1][2]的值 该元素值
2、行指针与列指针:
定义: 指向行的指针叫行指针,指向列的指针叫列指针
关系: *行指针 <=> 列指针 &列指针 <=> 行指针
要点: 1、行指针指向行,表示该行地址; (行指针不指向某一具体单元,而指向行(该行首地址))
列指针指向列,即某个元素,代表该元素的地址
例如:(a+1)是行指针,它指1向行的首地址,而不是a[1][0]的地址,故:*(a+1)不是代表a[1][0]的值,
而是转为了列指针,代表a[1][0]的地址,而*(*(a+1)才代表a[1][0]的值;
a[1]是列指针,它指向1行0列元素的地址,故*a[1]即a[1][0]的值
2、对行指针加1,代表下一行的首地址;如(a+2)代表2行首地址
对列指针加1,代表下一个元素的地址;如(a[0]+5)代表元素[1][0]的地址
3、区分 1、二维数组名代表行指针; 如:a,a+1等就是行指针,*a,*(a+1)是列指针
2、一维数组名代表列指针: 如:对于一维数组b[4],b+1代表元素b[1]的地址
3、注意:若将二维数组a[][4]看出数组名为a[]的一维数组,则: a[1]代表元素a[1][0]的地址,而&a[1]则是行指针,代表1行的首地址;
程序举例: 1、 # include <stdio.h>
int main(void) {
int a[4] = {1, 3, 5, 7};
int (*p)[4]; //将p定义为行指针,它只能指向行,而不能指向某个元素; //int *p[4]; //error: int *p[4]定义了一个指针数组,该数组都是int * 型,即整型指针类型
p = &a;
//p = a; //error:一维数组a[4]的a为列地址,必须转为行地址&a,才能赋值给列指针; printf("%d\n", (*p)[3]); return 0; }
2、 # include <stdio.h>
int main(void) {
int i, j;
int a[3][4] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23};
int (*p)[4]; p = a;
printf("please input row and colum\n");
scanf("%d%d", &i, &j);
printf("a[%d,%d] = %d\n", i, j, *(*(p+i)+j));
return 0; }
/**********************************************************************************************************
注意:
*(*(p+i)+j)) 等价于 (*(P+i))[j] //(*(P+i))相当于一维数组名a[i];
不等价于*(P+i)[j] //*(P+i)[j]相当于a[i+j][0],为什么我也不知道,运行结果是这样;
*(P+i)[j]不等价于*(p+i+j),*(p+i+j)是i+j行的首地址,是列地址 **********************************************************************************************************/