> 文章列表 > 【C++】对数组指针的理解,例如 int (*p)[3]

【C++】对数组指针的理解,例如 int (*p)[3]

【C++】对数组指针的理解,例如 int (*p)[3]

目录

  • 简介
  • 思考
  • 理解
  • 结语

【C++】对数组指针的理解,例如 int (*p)[3]

简介

Hello!
非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~
 
ଘ(੭ˊᵕˋ)੭
昵称:海轰
标签:程序猿|C++选手|学生
简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研
学习经验:扎实基础 + 多做笔记 + 多敲代码 + 多思考 + 学好英语!
 
唯有努力💪
 
本文仅记录自己感兴趣的内容

思考

数组指针指向数组的指针

int (*p)[3]

  • 首先括号里面是*p,说明p是一个指针,*只作用于p,对int无影响(因为有括号)
  • 所以数组大小为3,且里面的元素都是int类型

也就是,p是一个指针,指向含有三个int元素的数组

【C++】对数组指针的理解,例如 int (*p)[3]


场景一:

int (*p)[3]
那么++p时,指针p是怎么移动的呢?

++p

那么每次p就会跨过3个int元素
【C++】对数组指针的理解,例如 int (*p)[3]

举例分析:

#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]

代码解释:

  • int a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; 构造一个一维数组,长度为9
  • int (*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]

所以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]
解释:++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]
【C++】对数组指针的理解,例如 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)[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]

其实和一维数组差不多,因为二维数组在内存也是顺序存储的(这里按照行存储)

【C++】对数组指针的理解,例如 int (*p)[3]

修改一下: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]

其实理解就想成每三个元素为一组,进行不断划分就好了(画图帮助自己理解)
【C++】对数组指针的理解,例如 int (*p)[3]

理解

记住:

  • 数组指针,是一个数组的指针,指向一个数组
  • 无论是一维还是二维,反正就是按照数组大小进行划分为多个组,每次++或者--,要跨过n个元素

结语

文章仅作为个人学习笔记记录,记录从0到1的一个过程

希望对您有一点点帮助,如有错误欢迎小伙伴指正

在这里插入图片描述

WIFI共享