
1. 指针与一维数组的关系
(1) 数组名是指针常量
一维数组名是指向该数组第一个元素的指针常量。
int a[7]={12,25,18,30,63,44,50};
a的值等于&a[0],类型int * const
*a为a[0]元素,*a的值为a[0]的值。
a为指针常量,即其值不可修改,使用a++是错误的。
(2) 数组元素的下标和指针访问方式
int a[7]={12,25,18,30,63,44,50};
*a等价于与a[0],*(a+1)等价于a[1],*(a+i)等价于a[i]
数组a中下标为i的元素的两种访问方式:a[i]和*(a+1)
int *p=a+i; //*p等价于a[i],*p++是合法的,*a++不合法。
(3) 利用不同方式访问数组元素举例
for(i=0; i<7; i++) printf("%5d\n",a[i]);//下标方式
for(i=0; i<7; i++) printf("%5d\n",*(a+i));//指针方式
for(p=a; p<a+7; p++) printf("%5d\n",*p);//指针方式
for(p=a,i=0;i<7;i++) printf("%5d\n",p[i]);//下标方式
2. 指针与二维数组的关系
(1) 二维数组名是指针常量
二维数组名是指向该数组第一行元素的指针常量,其值为整个二维数组空间的首地址,亦即行、列下标均为0的第1个元素的地址。
int b[3][4]={{1,2,3,4},{2,4,6,8},{3,6,9,12}};
b[0]为元素类型为int的、长度为4的一维数组
b[0]数组包含有4个元素:b[0][0]、b[0][1]、b[0][2]、b[0][3]
的值为:&b[0]即&b[0][0];b值的类型为: int(*const)[4]
b[i]为int型的一维数组,b[i]为数组名;b[i]的值为:b[i][0]的地址
b[i]值的类型: int* const;b和b[i]为指针常量,其值不允许被修改
(2) 把二维数组名的值赋给同类型的指针变量
二维数组名的值可以赋给同类型的指针变量,然后通过此指针变量访问每个二维元素。
int b[3][4];// b的值为int (*)[4]类型
int (*pb)[4]=b;//pb为int (*)[4]类型
pb[2][3]等同于b[2][3]
int (*pb)[4]与int (*pb)[5]类型不同
int *pb[4]与int (*pb)[4]不同,前者是指针数组,后者是指向数组的指针。
(3) 二维数组元素的下标和指针访问方式
int b[m][n];
下标访问方式:b[i][j]
指针访问方式表示1:(*(b+i))[j]
指针访问方式表示2:*(b[i]+j)
指针访问方式表示3:*(*(b+i)+j)
for(i=0; i<3; i++) {
for(j=0; j<4; j++)
printf("%d ", b[i][j]);//可改为任一种指针(间接)方式
printf("\n");
}