使用指针操作二维数组
数组指针 *p/*(p)[j]
指向二维数组元素的指针,一个地址,你需要的,只是这一个数组里面的各个元素指向一维数组的指针,多个地址,能访问指定行的元素
指针数组 *a[i]
保存多个地址的时候,能表示多个数组 ,可以指向某一行的数组
Q:在定义二维数组及传递参数时,经常有指针类型不匹配问题,
二维数组的表达式有多种,它们的类型都是怎样的呢?
是不是定义任意形式的二维数组都可以呢?
R:下面分别以字符串二维数组和整数型二维数组讨论:
任务一:输出每一行的字符串
方案一:定义 char *name[],形参 char *name[]
#include <stdio.h>
void print(char *name[],int n);
int main( )
{
char *name[]= {"Zhao", "Qian", "Sun", "Li", "Zhou"};
print(name, 5);
return 0;
}
void print(char *name[],int n)
{
int i;
for(i=0; i<n; i++)
printf("%s\n", name[i]); //name[i]是指向第i行字符数组的指针
}
方案二:定义 char name[5][5],形参 char (*name)[5]
#include <stdio.h>
void print(char (*name)[],int n);
int main( )
{
char name[5][10]={"Zhao", "Qian", "Sun", "Li", "Zhou"};
print(name, 5);
return 0;
}
void print(char (*name)[10],int n)
{
int i;
for(i=0; i<n; i++)
printf("%s\n", name[i]); //name[i]是第i行的一维字符数组
}
可见,printf("%s",a);打印字符串,a既可以是指针,也可以是数组。
任务二:输出第三行的整型元素
方案一:定义int score[][4],形参 int (*p)[4]
#include <stdio.h>
void search(int (*p)[4],int n);
int main(){
int score[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}};
search(score,2);
return 0;
}
void search(int (*p)[4],int n){
int i;
printf("No.%d: ",n);
for(i=0;i<4;i++)
printf("%4d",*(*(p+n)+i));
}
失败的方案:
将二维字符串数组定义成 char (*name)[5]
将二维整数型数组定义成 int (*score)[4]
将二维整数型数组定义成 int *score[4]
总结:
在定义整型二维数组时,只能定义成1)的形式,形参类型要匹配
1)int score[3][4] int (*)[4]
2)int *p[4] int **
3)int (*p)[4] int (*)[4]
在定义字符串二维数组时,可以定义成4)/5)的形式,形参类型要匹配
4) char name[][10] char (*)[10]
5) char *name[10] char **
6) char (*name)[10] char (*)[10]
可以看出:
二维数组名是一个数组指针,而非二级指针
指针数组的数组名等价于一个二级指针
对于二维数组int a[ROW][COLUMN]来说,行指针的本质就是一个指向包含
COLUMN个元素一维数组的指针,也就是int (*p)[COLUMN],
而列指针的本质就是一个指向元素的指针,也就是int *p;
比如int (*p)[3]; 它表示,数组 *p(p[0]) 具有三个int类型元素,分别为 (*p)[0] , (*p)[1] , (*p)[2]
即 p是指向一个具有三个int类型的一维数组的指针,也就是说,p为行数组指针
对于指针数组int *p[3]来说,p是一个二级指针,
p[0],p[1],p[2]均是一级指针,p[0]表示一个(元素是int类型的)数组
进一步思考,为什么可以用char *name[10]定义字符串二维数组,
却不能用int *score[4]定义整型二维数组呢?
再问:为什么不能用数组指针定义一个二维数组呢,与直接定义一个二维数组的区别在哪?