二维数组与指针

二维数组: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);

posted @ 2015-12-05 15:21  chris_chan1024  阅读(209)  评论(0编辑  收藏  举报