目录
- 简介
- 思考
- 理解
- 结语
简介
Hello!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
唯有努力💪
本文仅记录自己感兴趣的内容
思考
数组指针,指向数组的指针
。
int (*p)[3]
- 首先括号里面是
*p
,说明p是一个指针,*
只作用于p
,对int
无影响(因为有括号) - 所以数组大小为3,且里面的元素都是int类型
也就是,p是一个指针,指向含有三个int
元素的数组
场景一:
int (*p)[3]
那么++p时,指针p是怎么移动的呢?
++p
那么每次p就会跨过3个int元素
举例分析:
#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;// 1
cout << "p[0][1] = "<<p[0][1] << endl;// 2
cout << "p[0][2] = "<<p[0][2] << endl;// 3
cout << "p[1][0] = "<<p[1][0] << endl;// 4
cout << "p[1][1] = "<<p[1][1] << endl;// 5
cout << "p[1][2] = "<<p[1][2] << endl;// 6
cout << "p[2][0] = "<<p[2][0] << endl;// 7
cout << "p[2][1] = "<<p[2][1] << endl;// 8
cout << "p[2][2] = "<<p[2][2] << endl;// 9
return 0;
}
运行结果:
代码解释:
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类型)
- 注:这里表述其实不太好,仅为个人理解过程
所以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;// 1
cout << "p[0][1] = "<<p[0][1] << endl;// 2
cout << "p[0][2] = "<<p[0][2] << endl;// 3
++p;
// 此时p一下移动了3个int元素的位置
cout << "p[0][0] = "<< p[0][0] << endl;// 4
return 0;
}
解释:++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;// 1
cout << "p[0][1] = "<<p[0][1] << endl;// 2
cout << "p[0][2] = "<<p[0][2] << endl;// 3
cout << "p[0][3] = "<<p[0][3] << endl;// 4
cout << "p[1][0] = "<<p[1][0] << endl;// 5
cout << "p[1][1] = "<<p[1][1] << endl;// 6
cout << "p[1][2] = "<<p[1][2] << endl;// 7
cout << "p[1][3] = "<<p[1][3] << endl;// 8
cout << "p[2][1] = "<<p[2][0] << endl;// 9
return 0;
}
结果:
场景二:在二维数组中呢
#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;// 1
cout << "p[0][1]= " << p[0][1] << endl;// 2
cout << "p[0][2]= " << p[0][2] << endl;// 3
cout << "p[0][3]= " << p[0][3] << endl;// 4
cout << "p[1][0]= " << p[1][0] << endl;// 5
cout << "p[1][1]= " << p[1][1] << endl;// 6
cout << "p[1][2]= " << p[1][2] << endl;// 7
cout << "p[1][3]= " << p[1][3] << endl;// 8
return 0;
}
其实和一维数组差不多,因为二维数组在内存也是顺序存储的(这里按照行存储)
修改一下: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;// 1
cout << "p[0][1]= " << p[0][1] << endl;// 2
cout << "p[0][2]= " << p[0][2] << endl;// 3
cout << endl;
cout << "p[1][0]= " << p[1][0] << endl;// 4
cout << "p[1][1]= " << p[1][1] << endl;// 5
cout << "p[1][2]= " << p[1][2] << endl;// 6
return 0;
}
运行结果:
其实理解就想成每三个元素为一组,进行不断划分就好了(画图帮助自己理解)
理解
记住:
- 数组指针,是一个数组的指针,指向一个数组
- 无论是一维还是二维,反正就是按照数组大小进行划分为多个组,每次
++
或者--
,要跨过n个元素
结语
文章仅作为个人学习笔记记录,记录从0到1的一个过程
希望对您有一点点帮助,如有错误欢迎小伙伴指正