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;
}

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

相关推荐
大白的编程日记.5 分钟前
【计算机基础理论知识】C++篇(二)
开发语言·c++·学习
网小鱼的学习笔记8 分钟前
python中MongoDB操作实践:查询文档、批量插入文档、更新文档、删除文档
开发语言·python·mongodb
C语言小火车11 分钟前
野指针:C/C++内存管理的“幽灵陷阱”与系统化规避策略
c语言·c++·学习·指针
Q_Q51100828518 分钟前
python的保险业务管理与数据分析系统
开发语言·spring boot·python·django·flask·node.js·php
亮11118 分钟前
Maven 编译过程中发生了 Java Heap Space 内存溢出(OutOfMemoryError)
java·开发语言·maven
凤年徐20 分钟前
【数据结构】时间复杂度和空间复杂度
c语言·数据结构·c++·笔记·算法
Chef_Chen22 分钟前
从0开始学习R语言--Day40--Kruskal-Wallis检验
开发语言·学习·r语言
Zhu_S W28 分钟前
深入理解Java虚拟机:Java内存区域与内存溢出异常
java·开发语言·jvm
灰海33 分钟前
原型与原型链到底是什么?
开发语言·前端·javascript·es6·原型模式·原生js
踏莎行hyx40 分钟前
使用langchain连接llama.cpp部署的本地deepseek大模型开发简单的LLM应用
c++·ai·langchain·大模型·llama.cpp·deepseek