C++指针数组、数组指针、数组名及二维数组技巧汇总

C++指针数组、数组指针、数组名及二维数组技巧汇总

在C++中,指针数组、数组指针、数组名及二维数组是比较容易混淆的概念,下面我们一一介绍。

数组名

数组名是一个常量指针,指向数组的第一个元素的地址。例如,下面的代码定义了一个整型数组arr,arr即指向数组第一个元素的地址。

int arr[10];
int *p = arr;  // arr等价于&p[0]

指针数组

指针数组是由一组指针构成的数组,也就是说,数组中每个元素都是一个指针。例如,下面代码定义了一个存放5个指向int类型变量的指针的指针数组ptrArr。

int *ptrArr[5];  // 指针数组

数组指针

数组指针是一个指向数组的指针。例如,下面代码定义了一个指向整型数组的指针arrayPtr。

int arr[10];
int (*arrayPtr)[10] = &arr;  // 数组指针

二维数组

二维数组是一个数组,其中的每个元素又是一个数组,也就是在一个数组中放置了若干数组。例如,下面代码定义了一个3行4列的二维整型数组val。

int val[3][4];  // 二维数组

数组指针和指针数组的区别

数组指针指向一个数组,指针数组是一个数组,数组中的元素都是指针。二者的语法形式不同,使用方法也不同。例如,下面代码展示了如何对一个存储字符指针的指针数组进行初始化:

char *str[3] = {
  "Hello",
  "World",
  "C++"
};

而下面代码展示了如何使用数组指针对一维数组进行初始化:

int arr[5] = {1, 2, 3, 4, 5};
int (*ptr)[5] = &arr;

二维数组的技巧

使用指针访问二维数组

使用指针访问二维数组可以大幅提高访问效率,因为指针访问数组可以使用指针运算,避免了重复的下标计算。

int val[3][4];
int (*p)[4] = val;  // 定义指向二维数组的指针
// 使用指针遍历访问二维数组
for (int i = 0; i < 3; i++) {
  for (int j = 0; j < 4; j++) {
    *(*p + 4 * i + j) = i * j;
  }
}

定义二维数组参数

当定义一个参数是二维数组的函数时,可以使用行数明确指定二维数组的列数,也可以省略行数,让编译器自动推导列数。例如,下面展示了两种不同的定义方式:

// 声明时指定列数
void print_array(int arr[][5], int rows) {
  for (int i = 0; i < rows; ++i) {
    for (int j = 0; j < 5; ++j) {
      cout << arr[i][j] << " ";
    }
    cout << endl;
  }
}

// 编译器自动推导列数
void print_array_auto(int (*arr)[5], int rows) {
  for (int i = 0; i < rows; ++i) {
    for (int j = 0; j < 5; ++j) {
      cout << arr[i][j] << " ";
    }
    cout << endl;
  }
}

以上就是C++指针数组、数组指针、数组名及二维数组的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++指针数组、数组指针、数组名及二维数组技巧汇总 - Python技术站

(0)
上一篇 2023年6月25日
下一篇 2023年6月25日

相关文章

  • require与import

    require与import 在JavaScript中,require和import是两种不同的方法,都用于在一个文件中引入其他模块或库。本文将介绍它们的使用方法、差异以及应该如何选择使用哪一个。 require require是一个Node.js的方法,也可以在一些类似WebPack之类的开发工具中使用。通常,我们使用require来引入CommonJS模…

    其他 2023年3月28日
    00
  • Git 切换本地分支 切换远程分支

    Git 切换本地分支 切换远程分支 在git中,分支是代码管理过程中重要的一部分。由于团队协作的需要,可能需要切换本地分支和远程分支,以便在不同分支上进行开发和合并工作。本文将介绍如何在git中切换本地分支和远程分支。 切换本地分支 在git中,我们使用命令git checkout来切换本地分支。假设我们现在有一个本地分支feature-box,需要在该分支…

    其他 2023年3月28日
    00
  • 5款替代微软visio的开源免费软件

    当然,我很乐意为您提供有关“5款替代微软Visio的开源免费软件”的完整攻略。以下是详细的步骤和两个示例: 1. 什么是Visio? Visio是微软公司开发的一款流程图和矢量图绘制软件,可以用于绘制各种类型的图表、流程图、组织结构图、网络图等。 2. 5款替代微软Visio的开源免费软件 以下是5款替代微软Visio的开源免费软件: 2.1 Dia Dia…

    other 2023年5月6日
    00
  • 迅捷路由器FW325R的无线桥接

    迅捷路由器FW325R的无线桥接 迅捷路由器FW325R是一款兼具性价比和性能的路由器。它基于802.11ac无线标准和4个高性能天线,为您提供快速、可靠的WiFi连接。 在一些场景下,您可能需要将互联网连接控制在一个区域内。比如,您的电视在客厅,而互联网光猫在卧室。这时,您可以通过无线桥接实现客厅中的设备通过FW325R的无线信号访问互联网。 下面,我们将…

    其他 2023年3月28日
    00
  • Discuz和jQuery变量名冲突的3种解决方法

    解决Discuz和jQuery变量名冲突的3种方法 在使用Discuz和jQuery的同时,可能会遇到变量名冲突的问题。这是因为Discuz和jQuery都使用了一些常见的变量名,例如$和jQuery。为了解决这个问题,我们可以采取以下三种方法。 方法一:使用jQuery.noConflict() jQuery.noConflict()是一个jQuery提供…

    other 2023年8月8日
    00
  • PostgreSQL图(graph)的递归查询实例

    下面我将为您详细讲解 PostgreSQL 图(graph)的递归查询实例的完整攻略。 PostgreSQL图的递归查询实例 什么是 PostgreSQL 图? PostgreSQL 图(也称为 Graph 数据库)是一种基于图的数据库,它的数据结构是由节点和边(或叫关系)组成的。这种数据库可用于处理非结构化的数据,如社交网络、物流、地理空间等领域,是一个非…

    other 2023年6月27日
    00
  • Java 反射机制原理与用法详解

    Java 反射机制原理与用法详解 什么是 Java 反射机制 Java 反射是指程序可以自己获取自身的信息,如类名、属性、方法、注解等。通过反射,可以在运行时动态地获取类的信息、动态创建类对象、动态调用类的方法。 Java 反射的主要应用 动态生成Java类对象 动态获取类的属性、方法和注解等信息 动态调用类的方法 反射原理 Java反射机制是基于JVM来实…

    other 2023年6月27日
    00
  • Android Tablayout 自定义Tab布局的使用案例

    Android Tablayout 自定义Tab布局的使用案例 Tablayout是Android Material Design库中的一部分,它提供了一个用于展示多个页面的标签栏,很多应用程序都使用它来实现这个功能。默认情况下,Tablayout会使用系统提供的样式来展示标签。但是有时候我们可能需要自定义Tab布局,来满足一些特殊的需求。 本文将介绍如何使…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部