当前位置: 首页 > news >正文

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

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

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

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

定义

类型* 数组名[大小];

例子

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

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

怎么用

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

特点

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

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

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

定义

类型 (*指针名)[数组大小];

例子

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; // 指向第一行(也是一个数组)

怎么用

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

特点

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

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

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

定义

类型* (*指针名)[数组大小];

例子

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

怎么用

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:学生姓名管理(指针数组)

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

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

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:动态指针数组(指针数组指针)

int* createArray(int size) {
    return new int[size];
}

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

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

http://www.dtcms.com/a/103299.html

相关文章:

  • 怎么安装JSON服务器?JSON服务器最新安装教程
  • JavaScript中的模块化
  • GitHub Flow与GitLab Flow的详细
  • python求解常微分方程之Galerkin method:权函数
  • 【日期问题(判断星期几)】
  • 有哪些好用的项目管理工具推荐?并且支持AI定制和私有部署的?
  • 简单程序语言理论与编译技术·19 实现一个解释器
  • HTTP新的二进制格式与多路复用
  • 股指期货四个品种合约是什么意思?
  • OpenCV基础——图像滤波和形态学操作
  • 数字化计算机语言特性对比
  • 力扣HOT100之矩阵:48. 旋转图像
  • 《JVM考古现场(十四):混沌重启——从量子永生到宇宙热寂的终极编译》
  • 「Unity3D」TMP_InputField关闭虚拟键盘后,再次打开虚拟键盘,此时无法回调onSelect的问题
  • 文章配图新纪元:OpenAI新推出的GPT-4o原生图像生成功能启示
  • Joint Receiver Design for Integrated Sensing and Communications
  • 双向链表的理解
  • 【Kettle安装】Kettle安装过程, 电脑已安装java23,安装Kettle 出现报错:尝试启动 Java 虚拟机(JVM)时失败解决方法
  • JavaEE-MyBatis概述第一个程序
  • Redis GEO
  • [7-02-02].第15节:生产经验 - 消费者相关操作
  • 农产品直卖平台的设计与实现(代码+数据库+LW)
  • Burpsuite 伪造 IP
  • 数据结构与算法:二维动态规划
  • 图解AUTOSAR_SWS_CANDriver
  • 【区块链安全 | 第二十四篇】单位和全局可用变量(二)
  • 翻译: 人工智能如何让世界变得更美好四
  • BERT与Transformer到底选哪个-下部
  • css_z-index属性
  • C++STL---<functional>