二维数组和指针的关系
p = &a[0][0];
p = a[0];
p = *a;
q = a;
二维数组的数组名是指向第一行所有元素的一个数组指针
二维数组访问第m行第n列元素
a[m][n];
*(a[m] + n);
*(*(a+m)+n);
p = a[0]; *(p + m * N + n)
q = a; *((q + m) + n)
*(q[m] + n);
q[m][n];
a 指向第一行元素,a[1] 指向第二行
int main(void)
{
int a[2][3] = {1, 2, 3, 4, 5, 6};
int *p = NULL;
int (*q)[3] = NULL;
p = a[0];
q = a;
printf("=========================\n");
printf("&a[0][0]:%p\n", &a[0][0]);
printf("&a[0][1]:%p\n", &a[0][1]);
printf("&a[0][2]:%p\n", &a[0][2]);
printf("&a[1][0]:%p\n", &a[1][0]);
printf("&a[1][1]:%p\n", &a[1][1]);
printf("&a[1][2]:%p\n", &a[1][2]);
printf("=========================\n");
printf("a:%p\n", a);
printf("a+1:%p\n", a+1);
printf("=========================\n");
printf("*a:%p\n", *a);
printf("*a+1:%p\n", *a+1);
printf("=========================\n");
printf("a[0]:%p\n", a[0]);
printf("a[0]+1:%p\n", a[0]+1);
printf("=========================\n");
printf("a[1][2]:%d\n", a[1][2]);
printf("*(a[1]+2):%d\n", *(a[1]+2));
printf("*(*(a+1)+2):%d\n", *(*(a+1)+2));
printf("*(p+1*3+2):%d\n", *(p+1*3+2));
printf("*(*(q+1)+2):%d\n", *(*(q+1)+2));
printf("*(q[1]+2):%d\n", *(q[1]+2));
printf("q[1][2]:%d\n", q[1][2]); return 0;}
=========================
&a[0][0]:0x7ffe91771790
&a[0][1]:0x7ffe91771794
&a[0][2]:0x7ffe91771798
&a[1][0]:0x7ffe9177179c
&a[1][1]:0x7ffe917717a0
&a[1][2]:0x7ffe917717a4
=========================
a:0x7ffe91771790
a+1:0x7ffe9177179c
=========================
*a:0x7ffe91771790
*a+1:0x7ffe91771794
=========================
a[0]:0x7ffe91771790
a[0]+1:0x7ffe91771794
=========================
a[1][2]:6
*(a[1]+2):6
*(*(a+1)+2):6
*(p+1*3+2):6
*(*(q+1)+2):6
*(q[1]+2):6
q[1][2]:6
二维数组传参数
char str[5][32] = {0};
int fun(char (*pstr)[32]);
指针数组传参数
char *pstr[3] = {”how are you“};
int fun(char **pstr);
指针函数和函数指针
1.指针函数
指针函数是函数,函数返回值是指针
不能返回局部变量的地址
2.函数指针
指针指向函数