二维数组---指针数组和数组指针
以下纯属个人理解,如有错误请指正;
int a[4][3] = { 1,2,3,
5,6,7,
9,10,11,
13,14,15};
int a[4][3]={{1,2,3},
{4,5,6},
{7,8,9},
{10,11,12}};
//要先知道*和[],()的优先级顺序;()>[]>*;
#include <iostream>
using namespace std;
int main()
{
int a[2][5] = { 1,2,3,4,5,
6,7,8,9,10 };
int (*p1)[2][5];
int (*p2)[5];
int *p3;
p1 = &a;
p2 = a;
p2 = &a[0];
p2 = a + 1;
p2 = &a[1];
p3 = a[0];
p3 = &a[0][0];
system("pause");
return 0;
}
对于二维指针的理解如图所示:
理解:上图是一个二维数组a[2][5],将一个二维数组的第一维看作是一个两个元素的数组,数组名为a,元素分别为a[0],a[1];
然后将a[0]看做是一个含有5个元素的一维数组,其数组名为a[0],数组元素为a[0][0],a[0][1],a[0][2],a[0][3],a[0][4;a[1]的理解与其类似;
这样,a相当于一个含有两个元素的数组的数组名,也就是第一个元素的首地址,等价于&a[0];但是,类型为:int *[5];
a[0]就相当于一个含有五个元素的数组的数组名,也就是第一个元素的首地址,等价于&a[0][0],类型为:int *;
int *p[3]; //指针数组
//由于优先级顺序,p[]先定义的三个元素的数组;就是说p[0],p[1],p[2]只能存储指针变量的地址;
//然后在执行*,这样就定义了三个指针;
*********************************************************************
1.指针数组:是指向存储指针的数组;
int a,int b;
int *p[5]={&b,&a}
printf("%d",*(p[0])); == printf("%d",*p[0]);
int (*q)[3]; //数组指针
//由于优先级顺序,(*q)先定义的一个q指针;然后以这个指针为首地址,定义了三个元素的数组;
p[0] = &a[0][0]; //二维数组首元素的地址;
q = &a[0]; //这里表示第0行一维数组的首地址;
区别:&a;&a + 1 ; a ; *a ; **a ; a+1;*a+1 ; **a+1;
a是二维数组中第一维数组的地址:a = &a[0],那么*a是第一维数组的首地址:a[0],*(*a)是第一维数组第0个元素的值:a[0][0]
&a是二位数组的首地址,其类型为int *[2][5];
&a+1,表示下一个int *[2][5]的二维数组;
a,作为数组名,二维数组的第0行一维数组的首地址,其类型为:int *[5];
*a,是第0行一维数组的首元素的地址,其类型为:int *;
**a,是第0行一维数组首元素的值,类型为 int;
a+1,因为a的类型为int *[5],表示的是第1行一维数组(这个一维数组包含5个元素)的首地址;
*(a+1),表示的是第1行一维数组的首元素的地址;
**(a+1),则表示的是第1行首元素的值;
*********************************************************************
1. 数组指针:是指向数组的指针;
指向数组的指针表示的是:这个指针的内容是整个数组的首地址;
int f[5] = { 1,2,3,4 };
int (*p)[5];
p = &f;
这里定义的数组指针就是p,这里面存储的是整个数组f的首地址;
示例:
#include <iostream>
using namespace std;
int main()
{
int a = 6, b = 7;
int f[5] = { 1,2,3,4 };
int (*p)[5];
p = &f;
int *q[5] = { &a,&b };
printf("%d\n",(*p)[3]);
printf("%d\n", *(q[0]));
system("pause");
return 0;
}