【C++】对数组指针的理解,例如 int (*p)[3]
![【C++】对数组指针的理解,例如 int (*p)[3]](http://pic.ttrar.cn/nice/%e3%80%90C%e3%80%91%e5%af%b9%e6%95%b0%e7%bb%84%e6%8c%87%e9%92%88%e7%9a%84%e7%90%86.jpg)
目录
- 简介
- 思考
- 理解
- 结语
![【C++】对数组指针的理解,例如 int (*p)[3]](https://img-blog.csdnimg.cn/87dbd03958ad4675aab704226ff1ceee.png)
简介
Hello!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
唯有努力💪
本文仅记录自己感兴趣的内容
思考
int (*p)[3]
- 首先括号里面是
*p,说明p是一个指针,*只作用于p,对int无影响(因为有括号) - 所以数组大小为3,且里面的元素都是int类型
也就是,p是一个指针,指向含有三个int元素的数组
![【C++】对数组指针的理解,例如 int (*p)[3]](https://img-blog.csdnimg.cn/44e9b16d12b0422aae5e279ab501ac2f.png)
场景一:
int (*p)[3]
那么++p时,指针p是怎么移动的呢?
++p
那么每次p就会跨过3个int元素
![【C++】对数组指针的理解,例如 int (*p)[3]](https://img-blog.csdnimg.cn/3e0411d9333e43ddb50e4492685210b1.png)
举例分析:
#include<bits/stdc++.h>
using namespace std;
int main() {// int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};int (*p)[3];p = (int (*)[3])a;cout << "p[0][0] = "<< p[0][0] << endl;// 1cout << "p[0][1] = "<<p[0][1] << endl;// 2cout << "p[0][2] = "<<p[0][2] << endl;// 3cout << "p[1][0] = "<<p[1][0] << endl;// 4cout << "p[1][1] = "<<p[1][1] << endl;// 5cout << "p[1][2] = "<<p[1][2] << endl;// 6cout << "p[2][0] = "<<p[2][0] << endl;// 7cout << "p[2][1] = "<<p[2][1] << endl;// 8cout << "p[2][2] = "<<p[2][2] << endl;// 9return 0;
}
运行结果:
![【C++】对数组指针的理解,例如 int (*p)[3]](https://img-blog.csdnimg.cn/4cfd408c32044bafb4e70da03fb4499e.png)
代码解释:
int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};构造一个一维数组,长度为9int (*p)[3];,p是一个指向3个int类型元素的指针,也就是数组的指针->数组指针p = (int (*)[3])a;,这里就很关键!- p一次只能指向含有3个int元素的数组
- 但是a其中有9个元素
- 所以此时其实可以想象为:p一次可以指向(代表)3个int,那么9个int,则需要3个p指针进行表示即可
- 所以其实此时隐约有p[0],p[1],p[2],其中p[0]指向1,2,3,p[1]指向4,5,6…
- 也就是若执行++p,其实p移动了3个int类型元素长度(跨了3个int类型)
- 注:这里表述其实不太好,仅为个人理解过程
![【C++】对数组指针的理解,例如 int (*p)[3]](https://img-blog.csdnimg.cn/f84977fc4a7d4dc9b3f20e8410a9d056.png)
所以p[0][0]表示p[0]中3个元素的第一个元素,即p[0][0] = 1
如果++p,会发生什么呢?
#include<bits/stdc++.h>
using namespace std;
int main() {// int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};int (*p)[3];p = (int (*)[3])a;cout << "p[0][0] = "<< p[0][0] << endl;// 1cout << "p[0][1] = "<<p[0][1] << endl;// 2cout << "p[0][2] = "<<p[0][2] << endl;// 3++p;// 此时p一下移动了3个int元素的位置cout << "p[0][0] = "<< p[0][0] << endl;// 4return 0;
}
![【C++】对数组指针的理解,例如 int (*p)[3]](https://img-blog.csdnimg.cn/9d7d020e8e594083890582307bd095f9.png)
解释:++p,p每次会移动3个int类型的位置,因为p指向含有3个int类型元素的数组,那么每次移动,就是会跨过3个int元素
再修改一下:改为int (*p)[4];,也就是p指针一次可以指向4个元素
#include<bits/stdc++.h>
using namespace std;
int main() {// int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};int (*p)[4];p = (int (*)[4])a;cout << "p[0][0] = "<< p[0][0] << endl;// 1cout << "p[0][1] = "<<p[0][1] << endl;// 2cout << "p[0][2] = "<<p[0][2] << endl;// 3cout << "p[0][3] = "<<p[0][3] << endl;// 4cout << "p[1][0] = "<<p[1][0] << endl;// 5cout << "p[1][1] = "<<p[1][1] << endl;// 6cout << "p[1][2] = "<<p[1][2] << endl;// 7cout << "p[1][3] = "<<p[1][3] << endl;// 8 cout << "p[2][1] = "<<p[2][0] << endl;// 9return 0;
}
结果:
![【C++】对数组指针的理解,例如 int (*p)[3]](https://img-blog.csdnimg.cn/f485eef70e604a4e9ceb2a60bec98908.png)
![【C++】对数组指针的理解,例如 int (*p)[3]](https://img-blog.csdnimg.cn/d2beba5e7a4740fe88e9145034a62c1c.png)
场景二:在二维数组中呢
#include<bits/stdc++.h>
using namespace std;
int main() {int a[4][4];for(int i = 0; i < 4; ++i) {for(int j = 0; j < 4; ++j) {a[i][j] = i * 4 + j + 1;}}int (*p)[4];p = (int (*)[4])a;cout << "p[0][0]= " << p[0][0] << endl;// 1cout << "p[0][1]= " << p[0][1] << endl;// 2cout << "p[0][2]= " << p[0][2] << endl;// 3cout << "p[0][3]= " << p[0][3] << endl;// 4cout << "p[1][0]= " << p[1][0] << endl;// 5cout << "p[1][1]= " << p[1][1] << endl;// 6cout << "p[1][2]= " << p[1][2] << endl;// 7cout << "p[1][3]= " << p[1][3] << endl;// 8return 0;
}
![【C++】对数组指针的理解,例如 int (*p)[3]](https://img-blog.csdnimg.cn/e0ec0de50b7949a5be601e9b58438904.png)
其实和一维数组差不多,因为二维数组在内存也是顺序存储的(这里按照行存储)
![【C++】对数组指针的理解,例如 int (*p)[3]](https://img-blog.csdnimg.cn/e71aefe8690f48929edecaa5d6d77488.png)
修改一下:int (*p)[3];
#include<bits/stdc++.h>
using namespace std;
int main() {int a[4][4];for(int i = 0; i < 4; ++i) {for(int j = 0; j < 4; ++j) {a[i][j] = i * 4 + j + 1;}}int (*p)[3];p = (int (*)[3])a;cout << "p[0][0]= " << p[0][0] << endl;// 1cout << "p[0][1]= " << p[0][1] << endl;// 2cout << "p[0][2]= " << p[0][2] << endl;// 3cout << endl;cout << "p[1][0]= " << p[1][0] << endl;// 4cout << "p[1][1]= " << p[1][1] << endl;// 5cout << "p[1][2]= " << p[1][2] << endl;// 6return 0;
}
运行结果:
![【C++】对数组指针的理解,例如 int (*p)[3]](https://img-blog.csdnimg.cn/4ec0e9b978ce4e2fbea25eded69aa0a6.png)
其实理解就想成每三个元素为一组,进行不断划分就好了(画图帮助自己理解)
![【C++】对数组指针的理解,例如 int (*p)[3]](https://img-blog.csdnimg.cn/e93d7da675ae4f9bbe3fedad532daf51.png)
理解
记住:
- 数组指针,是一个数组的指针,指向一个数组
- 无论是一维还是二维,反正就是按照数组大小进行划分为多个组,每次
++或者--,要跨过n个元素
结语
文章仅作为个人学习笔记记录,记录从0到1的一个过程
希望对您有一点点帮助,如有错误欢迎小伙伴指正



