【带头学C++】----- 三、指针章 ---- 3.6 二维数组与数组指针的关系

在C++中,二维数组和数组指针虽然在某种程度上可以互相转换和使用,但它们并不完全等同。

首先,让我们明确二维数组和数组指针的定义:

  1. 二维数组是具有固定大小的多维数组,其元素以行和列的形式排列。例如,int array[3][4] 是一个大小为3×4的二维数组,其中包含12个整数元素。

  2. 数组指针是指向数组的指针变量。可以使用指针访问数组元素。例如,int (*ptr)[4] 是一个指向大小为4的整数数组的指针。

二维数组和数组指针之间有以下关系:

  1. 数组名是一个指向数组的指针:

    • 对于一个二维数组,数组名是指向第一行的指针。例如,int array[3][4] 中的 array 即为指向 array[0] 的指针。
    • 对于一个更高维度的多维数组,数组名也是指向第一个元素的指针。
  2. 数组指针可以用于处理二维数组:

    • 数组指针可以通过逐行遍历来访问二维数组中的每个元素。
    • 通过对指针进行指针算术运算,可以在二维数组中移动。

示例代码如下:

复制代码
int array[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};
int (*ptr)[4] = array; // 数组名即为指向第一行的指针

// 通过数组指针访问二维数组元素
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 4; j++) {
        cout << ptr[i][j] << " ";
    }
    cout << endl;
}

// 通过指针算术运算在二维数组中移动
cout << *(ptr[0] + 1) << endl; // 输出第一行的第二个元素 2
cout << *(*(ptr + 1) + 2) << endl; // 输出第二行的第三个元素 7
  1. 内存布局:

    • 二维数组在内存中是以连续的块的形式存储的,按照行主序的方式存储。也就是说,二维数组中的每一行是紧挨着前一行存储的。
    • 数组指针不一定连续存储,它只指向数组的某个位置。
  2. 数组维数:

    • 二维数组是一个确定维数的数组,例如 int array[3][4] 是一个具有3行4列的二维数组。
    • 数组指针不限于特定的维数,它可以指向多维数组的不同维度。
  3. 函数参数传递:

    • 二维数组可以作为函数参数进行传递。传递二维数组时,可以使用指针或引用的方式。
    • 数组指针也可以作为函数参数进行传递。可以通过传递数组指针来实现对二维数组的访问和处理。

示例代码如下:

复制代码
// 传递二维数组作为函数参数
void processArray(int arr[][4], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 4; j++) {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
}

// 传递数组指针作为函数参数
void processPointer(int (*ptr)[4], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 4; j++) {
            cout << ptr[i][j] << " ";
        }
        cout << endl;
    }
}

int main() {
    int array[3][4] = {
        {1, 2, 3, 4},
        {5, 6, 7, 8},
        {9, 10, 11, 12}
    };

    // 作为函数参数传递二维数组
    processArray(array, 3);

    // 作为函数参数传递数组指针
    processPointer(array, 3);

    return 0;
}
相关推荐
bkspiderx2 小时前
C++经典的数据结构与算法之经典算法思想:贪心算法(Greedy)
数据结构·c++·算法·贪心算法
speop2 小时前
llm的一点学习笔记
笔记·学习
运维小雅2 小时前
哪些因素会直观地影响到产品销量?
经验分享·笔记·媒体
w2sfot2 小时前
Passing Arguments as an Object in JavaScript
开发语言·javascript·ecmascript
抓饼先生3 小时前
Linux control group笔记
linux·笔记·bash
郝学胜-神的一滴3 小时前
避免使用非const全局变量:C++中的最佳实践 (C++ Core Guidelines)
开发语言·c++·程序人生
搞一搞汽车电子3 小时前
S32K3平台eMIOS 应用说明
开发语言·驱动开发·笔记·单片机·嵌入式硬件·汽车
中华小当家呐3 小时前
算法之常见八大排序
数据结构·算法·排序算法
总有刁民想爱朕ha4 小时前
车牌模拟生成器:Python3.8+Opencv代码实现与商业应用前景(C#、python 开发包SDK)
开发语言·python·数据挖掘
沐怡旸4 小时前
【算法--链表】114.二叉树展开为链表--通俗讲解
算法·面试