数组指针与指针数组这两者虽然听起来很像,但是他们的本质却截然不同
在这之前,我们先了解一下二维数组,二维数组的格式为 : 数组类型 数组名 [ ][ ];
前一个代表的是数组的行数,后一个代表的是数组的列数,其实二维数组的元素可以理解为是一维数组,
int a[2][2] = {{1,2},{3,4}};
这个 二维数组 由 两个一维数组 构成, 分别是 {1,2},{3,4};
还有一个概念要了解一下,优先级的概念
这‘ ( ) ’,‘ [ ] ’, ' * ' 三个标识符在语句中的优先级是 ' ( ) ' > ' [ ] ' > ' * '
接下来正式介绍数组指针与指针数组——
数组指针的本质是一个指向数组的指针;
指针数组的本质是一个包含元素为一个个指针的数组;
1.数组指针
数组有一维数组,二维数组,一般数组名可以被当作是指向数组首元素的地址。
而一维数组的数组指针形式以及应用如下
int a[5] = { 1,2,3,4,5 };
int* p = a; //一维数组指针
cout << p << endl;
cout << a << endl;
cout << &a[0] << endl; 三者的结果其实都是数组 a 的首元素的地址
cout<< p[1] << endl;
cout<< a[1] << endl; 这两者的结果是一样的 —— 指针 p 可以代替数组名 a 的位置;
而二维数组,我们之前讲过,二维数组的元素是一个个一维数组,而结合一维数组的指针,那么二维数组的指针应该是可以指向每一个一维数组的首元素地址,那么二维数组的指针形式如下
int a[2][2] = { {1,2},{3,4} };
int(*p)[2] = a; //二维数组指针
cout << p << endl;
cout << &a[0][0] << endl; 指针 p 指向的就是二维数组的首元素( a[0][0] )的地址。
cout<<p[1]<<endl;
cout<<&a[1]<<endl;
cout<<&a[1][0]<<endl; 这三者都是a[1][0]的地址,也是第一行的首元素的地址。
cout<<p[2]<<endl 得出来的是第二行的首元素的地址。
cout<<p[1][1]<<endl;
cout<<a[1][1]<<endl; 两者的结果也是一样的, p 可以代替数组名a;
2.指针数组
在这里我们讲一下指针数组的格式,
类型标识符 解引用符 数组名[ ]
int* p[5]; 指针数组
int (*p)[5]; 数组指针
注意 根据上文的优先级可以得知 :
在指针数组中变量名 p 是先和‘ [ ] ’ 结合构成数组,而‘ * ’则是和 ‘ int ’联系,表明数组的元素类型为整形指针,最终构成一个指针数组。
在数组指针中变量名 p 在‘( )’的作用下,先是和 ‘ * ’ 结合构成指针,之后在与 ' [ ] ' 结合构成数组指针。
指针数组的实际操作如下
int a = 10;
int b = 5;
int* p[2] = {&a,&b}; 指针数组
cout << p[1] << endl; 输出的是 a 的地址
cout << *p[1] << endl; 输出的是 10
标签:数组,int,元素,二维,一维,指针
From: https://blog.csdn.net/2302_80638085/article/details/140675627