C++的指针数组、数组指针和指针数组指针

C++指针与数组:简单详细指南

1. 指针数组(数组里存指针)

是什么:一个普通数组,但每个元素都是指针

定义

cpp 复制代码
类型* 数组名[大小];

例子

cpp 复制代码
int a=1, b=2, c=3;
int* numPtr[3] = {&a, &b, &c}; // 存了3个int指针

char* names[2] = {"小明", "小红"}; // 存了2个字符串指针

怎么用

cpp 复制代码
cout << *numPtr[0]; // 输出1(通过第一个指针访问a的值)
cout << names[1];   // 输出"小红"(第二个字符串)

特点

  • 数组有多大,就能存多少个指针
  • 适合存储多个字符串(字符串本身就是指针)

2. 数组指针(指向数组的指针)

是什么:一个指针,专门指向整个数组

定义

cpp 复制代码
类型 (*指针名)[数组大小];

例子

cpp 复制代码
int arr[3] = {10,20,30};
int (*arrPtr)[3] = &arr; // 指向这个包含3个数的数组

int matrix[2][3] = {{1,2,3}, {4,5,6}};
int (*rowPtr)[3] = matrix; // 指向第一行(也是一个数组)

怎么用

cpp 复制代码
cout << (*arrPtr)[1]; // 输出20(先解引用得到数组,再取下标1)
cout << rowPtr[1][2]; // 输出6(第二行第三列)

特点

  • 对指针加减时,会跳过整个数组
  • 处理二维数组时特别有用

3. 指针数组指针(指向指针数组的指针)

是什么:指向"装着指针的数组"的指针

定义

cpp 复制代码
类型* (*指针名)[数组大小];

例子

cpp 复制代码
int x=1, y=2, z=3;
int* ptrArr[2] = {&x, &y}; // 指针数组
int* (*superPtr)[2] = &ptrArr; // 指向这个指针数组的指针

怎么用

cpp 复制代码
cout << *(*superPtr)[0]; // 输出1(先得到数组,再取第一个指针,最后解引用)

特点

  • 用得比较少,主要在需要修改指针数组本身时使用

对比总结

类型 例子 本质 常见用途
指针数组 int* arr[3] 数组(元素是指针) 存多个字符串
数组指针 int (*arr)[3] 指针(指向数组) 处理二维数组
指针数组指针 int* (*arr)[3] 指针(指向指针数组) 动态修改指针数组

记忆口诀

  1. 看括号:有括号先看括号内

    • int* arr[3] → 先看[3]是数组,再看*是指针 → 指针数组
    • int (*arr)[3] → 先看(*arr)是指针,再看[3] → 数组指针
  2. 从右向左读

    • int* (*arr)[3]
      1. arr是...
      2. 指针*...
      3. 数组[3]...
      4. 指针int*...
        → 指向"包含3个int指针的数组"的指针

实际应用场景

场景1:学生姓名管理(指针数组)

cpp 复制代码
const char* students[3] = {"张三", "李四", "王五"};
for(int i=0; i<3; i++) {
    cout << "学生" << i+1 << ": " << students[i] << endl;
}

场景2:处理成绩表(数组指针)

cpp 复制代码
int scores[2][3] = {{90,85,95}, {70,80,75}};

// 用数组指针处理行
int (*row)[3] = scores;
cout << "第一行平均分: " 
     << (row[0][0] + row[0][1] + row[0][2])/3;

场景3:动态指针数组(指针数组指针)

cpp 复制代码
int* createArray(int size) {
    return new int[size];
}

int main() {
    int* (*funcPtr)(int) = &createArray; // 指向函数的指针
    int* dynamicArr = funcPtr(5); // 创建动态数组
    // 使用后记得 delete[] dynamicArr;
}

记住:遇到复杂声明时,先找变量名,然后按照优先级(括号>右边>左边)逐步解析。

相关推荐
愚润求学2 分钟前
【专题刷题】二分查找(一):深度解刨二分思想和二分模板
开发语言·c++·笔记·leetcode·刷题
EnigmaCoder3 分钟前
java面向对象编程【基础篇】之基础语法
java·开发语言
tanyongxi664 分钟前
手撕C++STL list:深入理解双向链表的实现
开发语言·c++·链表
岩中竹4 分钟前
力扣热题100题解(c++)—矩阵
数据结构·c++·程序人生·算法·leetcode·矩阵
YuforiaCode4 分钟前
第十五届蓝桥杯 2024 C/C++组 拼正方形
c语言·c++·蓝桥杯
啊阿狸不会拉杆7 分钟前
数据结构-图
java·c语言·数据结构·c++·python·算法·图论
沙尘暴炒饭19 分钟前
vuex持久化vuex-persistedstate,存储的数据刷新页面后导致数据丢失
开发语言·前端·javascript
Msshu12322 分钟前
诱骗协议芯片支持PD2.0/3.0/3.1/PPS协议,支持使用一个Type-C与电脑传输数据和快充取电功能
c语言·开发语言·电脑
双叶8361 小时前
(51单片机)LCD展示动画(延时函数)(LLCD1602教程)
c语言·数据库·c++·单片机·嵌入式硬件·51单片机
景天科技苑1 小时前
【Rust结构体】Rust结构体详解:从基础到高级应用
开发语言·后端·rust·结构体·关联函数·rust结构体·结构体方法