二维数组与指针
二维数组:int a[3][4];
表示形式 | 含义 |
a | 二维数组名,指向一维数组a[0],0行首地址 |
a[0],*(a+0),*a | 0行0列元素地址 |
a+1,&a[1] | 1行首地址 |
a[1],*(a+1) | 1行0列元素a[1][0]的地址 |
a[1]+2,*(a+1)+2,&a[1][2] | 1行2列元素a[1][2]的地址 |
*(a[1]+2),*(*(a+1)+2),a[1][2] | 1行2列元素a[1][2]的值 |
//出处谭浩强《C程序设计(第四版)》247页
int a[3][4]; int *p; p=a[0]; p++; //p+(i*m+j);地址 p<a[0]+12; int (*q)[4]; //q指向包含4个整型元素的一维数组 q=a; *(*(q+i)+j); //a[i][j]值 int **p; p=a; //error C2440: '=' : cannot convert from 'int [3][4]' to 'int ** '
使用指针向函数传递多维数组方法:
1、void fun(int a[3][4]);限制规定只能传递3行4列int数组
2、void fun(int a[][4]);或void fun(int(*p)[4]); *p是行指针,但只能指向4个int数据的数组
3、void fun(int **a); 动态处理各行各列不一长度的数据
ps:只有把二维数组改成指向向量的指针数组的前提下才可这么做!
数组和指针参数是如何被编译器修改的?
“数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写成“数组的指针”,而不是“指针的指针”:
实参 所匹配的形参
数组的数组 char c[8][10]; char (*)[10]; 数组指针
指针数组 char *c[10]; char **c; 指针的指针
数组指针(行指针) char (*c)[10]; char (*c)[10]; 不改变
指针的指针 char **c; char **c; 不改变
int a[3][4]; int **p; int (*q)[4]; int *w[4]; p=w; q=a; p=a; //error C2440: '=' : cannot convert from 'int [3][4]' to 'int ** ' p=q; //error C2440: '=' : cannot convert from 'int (*)[4]' to 'int ** ' w=a; //error C2440: '=' : cannot convert from 'int [3][4]' to 'int *[4]'
指针数组:char *name[]={"follow me",hello c",computer design"};
指向指针的指针:char **p;
p=name+1;
printf("%d\n",*p); //地址
printf("%s\n",*p); //输出字符串,hello c
指向函数的指针:类型名 (*指针变量名)(函数参数表列);
eg:
int (*P)(int ,int);
p=max;
int c=(*p)(a,b);