05_C++数组指针和指针数组
1.数组指针:当数组指针指向一个一维数组时,()优先级高,说明p是指针,指向一个整型的一维数组。这个一维数组的长度是n,也可以说p的步长为n。当p+1时,p指针会跨过n个整型数据的长度。
2.指针数组:当定义一个一维数组时,系统会在内存中为改数组分配一个储存空间,其数组的变量名就是数组的首地址。若定义一个指针变量,并将数组的首地址赋值给指针变量,则我们说该指针指向了这个一维数组。
是一个由n个指针类型元素组成的指针数组,或者说这个当一个数组里含有的元素为指针类型的时候,它就被成为指针数组。
#include<iostream> #include<string> using namespace std;int main() { //含有5个整数的数组,元素值分别为1,2,3,4,5 int arr[5] = { 1,2,3,4,5 }; //数组指针,由内向外的顺序,首先p是个指针,指向大小为5的数组的指针 int(*p)[5] = &arr; //指针数组,通过循环将arr数组每行的首地址分别赋值给q里的元素 int* q[5]; for (int i=0;i<5;i++) q[i] = &arr[i]; cout << "arr:" << arr << endl; cout << " &arr[0]" << &arr[0] << endl; cout << "p[0]:" << p[0] << endl; cout << "*p:" << *p << endl; cout << "*p[0]:" << *p[0] << endl; cout << "**p:" << **p << endl; cout << "*************" << endl; cout << "&(p[0]):" << &(p[0]) << endl; cout << "&(*p):" << &(*p) << endl; cout << "*************" << endl; cout << "q[0]:" << q[0] << endl; cout << "&(q[0]):" << &(q[0]) << endl; //访问数组元素 for (auto i : arr) cout << i << endl; for (auto i : q) cout << i << endl; }
输出
当定义一个一维数组时,系统会在内存中为改数组分配一个储存空间,其数组的变量名就是数组的首地址。若定义一个指针变量,并将数组的首地址赋值给指针变量,则我们说该指针指向了这个一维数组。arr[0]的地址也是数组的首地址。
通过循环将arr数组每行的首地址分别赋值给q里的元素,这里int * q[5]表示一个一维数组内存放五个指针变量,q[0]存储的是指向arr[0]的指针,以此类推。
#include<iostream> #include<string> #include<vector> using namespace std; using std::vector; int main() { //含有7个整数的数组,元素值分别为1,2,3,4,5,6,7 int arr[7] = { 1,2,3,4,5,6,7 }; int(*p)[7] = &arr; cout << "arr:" << arr << endl; cout << " &arr[0]" << &arr[0] << endl; cout << "p+1:" << p+1 << endl; cout << "*p+1:" << *p+1 << endl; cout << "*************" << endl; } }
输出:
补充:打印p+1与*p+1。p与*p中存放的地址的数值是一样的,但意义却大不一样。p是数组arr的地址,所以p+1跳过了整个数组的字节大小。
数组地址+1减去数组地址,即16进制的CC-B0=1C,转换成10进制就是28,刚好是一个有着7个int类型元素的数组的大小。
*p相当于数组名arr,是数组首元素的地址。所以 *p+1跳过了一个int类型。
根据图中打印出来的地址,我们可以看到:数组首元素地址+1减去数组首元素地址,即16进制的B4-B0=4。这是一个int类型值的大小。
参考:https://blog.csdn.net/2301_77446344/article/details/132852351
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程