1.数组指针的本质:本质是指针,只是该指针指向的内容是数组。
2.数组指针的形式
存储类型 数据类型 (*数组指针变量名) [列数];
eg: int (*p) [10]; //定义了数组指针p ,其中p指针指向有10个int型元素的一维数组
此时如果进行 p+1 操作的话则:
p+1; //向地址大的方向偏移1个数据类型;
eg2:
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}}; //初始化二维数组
int (*p)[4] = a; //初始化数组指针
int (*q)[4]; //先定义数组指针,再去赋值
q = a;
3.用数组指针输出二维数组的值并且求二维数组中各个元素的和
源代码
#include<stdio.h>
int main()
{
int a[3][4]={{1,2,3,4},{5,6,7,8,},{9,10,11,12}};
int *q=&a[0][0]; //&a[0][0]等价于a[0]
int (*p)[4]=a; //初始化数组指针 注意: 数据类型 (*数组指针变量名) [列数]
int h,l,sum=0;
int sum1=0,sum2=0,sum3=0;
//用指针遍历二维数组
putchar('\n');
puts("用指针遍历二维数组:\n");
for(h=0;h<12;h++)
{
printf("%d ",*q);
q++;
}
putchar('\n');
puts("用数组指针遍历二维数组:\n");
for(h=0;h<3;h++)
for(l=0;l<4;l++)
{
printf("%d",p[h][l]);
//a[h][l],p[h][l],*(*(a+h)+l),*(*(p+h)+l) 这几个表达式等价
}
puts("用数组指针求二维数组的和:\n");
for(h=0;h<3;h++)
for(l=0;l<4;l++)
{
sum+=p[h][l];
sum1+=a[h][l];
sum2+=*(*(a+h)+l);
sum3+=*(*(p+h)+l); //
}
//sum,sum1,sum2,sum3 等价
printf("sum=%d sum1= %d sum2=%d sum3= %d\n",sum,sum1,sum2,sum3);
return 0;
}
4.结论:
二维数组中第h,l个元素的表示:(h为行:0,1,... l为列:0,1,....)
a[h][l] p[h][l] *(*(a+h)+l) *(*(p+h)+l)
二维数组中第h,l个元素的地址表示:(h为行:0,1,... l为列:0,1,....)
&a[h][l] &p[h][l] *(a+h)+l *(p+h)+l