二级指针与二维数组
int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };//二维数组
//二维数组在概念上是二维的,有行和列。
//但在内存中所有的数组元素都是连续排列的,它们之间没有“缝隙”。
//a[0][3]与a[1][0]地址相邻
int *p = &a[0][0]//一级指针指向单个地址
int *p[3];//指针数组,下有3个指针
// 指针数组是数组元素为指针的数组,其本质为数组。
//(例如 int *p[3],定义了p[0],p[1],p[2]三个指针)
int (*p)[5] = a;//数组指针
//数组指针指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。
int **p;//二级指针,指向一级指针的地址
显然不能用二级指针直接传递二维数组,可采用以下方法
1.数组指针传递
#include<stdio.h>
int sum(int (*a)[3],int x){
//列数已经固定
//int (*a)[3]也可写作int a[][3],可读性更高
int s=0,i,j;
for(i=0;i<x;i++){
for(j=0;j<3;j++){
s+=a[i][j];
}
}
return s;
}
int main()
{
int a[21][3],n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<3;j++){
scanf("%d",&a[i][j]);
}
}
printf("%d\n",sum(a,n));
return 0;
}
2.指针数组传递
#include<stdio.h>
int sum(int **a,int n,int m){
//此处**a也可写为*a[]
//*p[]在传递时退化为指针,即指针数组的指针
int s=0,i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
s+=a[i][j];
}
}
return s;
}
int main()
{
int a[21][21],n,i,j,m;
int *p[21];
scanf("%d%d",&n,&m);
for(i=0;i<n;i++){
for(j=0;j<m;j++){
scanf("%d",&a[i][j]);
}
}
for(int i=0;i<n;i++) p[i]=a[i];
printf("%d\n",sum(p,n,m));
return 0;
}