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


    3.7 数组指针   

    在C++中,数组指针是指向数组的指针。可以使用指针来操作数组,例如访问数组元素或传递数组到函数。在C++中,数组名实际上是一个指向数组第一个元素的指针。

    下面是一些有关数组指针的重要概念:

    1. 定义数组指针:数组指针可以通过使用指针声明运算符(*)来定义。例如,int* ptr 定义了一个指向整型数据的数组指针。

    2. 初始化数组指针:可以将数组的地址赋值给数组指针,以便指向该数组。例如,int arr[5] = {1, 2, 3, 4, 5}; int* ptr = arr; 这里将数组 arr 的地址赋值给指针 ptr

    3. 访问数组元素:通过使用数组指针,可以访问和操作数组元素。可以使用指针解引用操作符(*)来访问指针指向的数组元素。例如,int x = *ptr; 将指针 ptr 所指向的第一个元素的值赋给变量 x

    4. 数组指针的指针算术运算:指针算术运算允许在数组中移动指针,以访问其他元素。在使用指针算术运算时,指针将根据其数据类型进行适当的偏移。例如,ptr++ 将指针 ptr 向前移动一个位置,以指向下一个元素。

    5. 传递数组给函数:可以将数组指针作为参数传递给函数。在函数声明中,可以使用指针作为形参,以接受数组参数。函数可以使用指针操作数组,就像在主函数中一样。

    下面是一个简单的示例,演示了如何使用数组指针操作数组:

    1. #include <iostream>
    2. void printArray(int* arr, int size) {
    3. for (int i = 0; i < size; i++) {
    4. std::cout << arr[i] << " ";
    5. }
    6. std::cout << std::endl;
    7. }
    8. int main() {
    9. int arr[5] = {1, 2, 3, 4, 5};
    10. int* ptr = arr;
    11. // 访问数组元素
    12. std::cout << "第一个元素:" << *ptr << std::endl;
    13. std::cout << "第二个元素:" << *(ptr + 1) << std::endl;
    14. // 传递数组给函数
    15. printArray(arr, 5);
    16. return 0;
    17. }

    在上面的示例中,我们首先定义了一个 printArray 函数,它接受一个整型数组指针和数组的大小作为参数,并打印数组的元素。

    然后,在主函数中,我们定义了一个名为 arr 的整型数组,并将其地址赋给指针 ptr。我们使用指针解引用操作符 * 来访问 ptr 指向的数组元素,并打印出第一个元素和第二个元素。

    接下来,我们调用 printArray 函数,并将数组 arr 和数组的大小作为参数传递给函数。函数打印数组的所有元素。

    输出结果为:

    1. 第一个元素:1
    2. 第二个元素:2
    3. 1 2 3 4 5

    3.8二维数组与数组指针的关系 

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

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

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

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

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

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

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

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

    示例代码如下:

    1. int array[3][4] = {
    2. {1, 2, 3, 4},
    3. {5, 6, 7, 8},
    4. {9, 10, 11, 12}
    5. };
    6. int (*ptr)[4] = array; // 数组名即为指向第一行的指针
    7. // 通过数组指针访问二维数组元素
    8. for (int i = 0; i < 3; i++) {
    9. for (int j = 0; j < 4; j++) {
    10. cout << ptr[i][j] << " ";
    11. }
    12. cout << endl;
    13. }
    14. // 通过指针算术运算在二维数组中移动
    15. cout << *(ptr[0] + 1) << endl; // 输出第一行的第二个元素 2
    16. cout << *(*(ptr + 1) + 2) << endl; // 输出第二行的第三个元素 7
    1. 内存布局:

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

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

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

    示例代码如下:

    1. // 传递二维数组作为函数参数
    2. void processArray(int arr[][4], int rows) {
    3. for (int i = 0; i < rows; i++) {
    4. for (int j = 0; j < 4; j++) {
    5. cout << arr[i][j] << " ";
    6. }
    7. cout << endl;
    8. }
    9. }
    10. // 传递数组指针作为函数参数
    11. void processPointer(int (*ptr)[4], int rows) {
    12. for (int i = 0; i < rows; i++) {
    13. for (int j = 0; j < 4; j++) {
    14. cout << ptr[i][j] << " ";
    15. }
    16. cout << endl;
    17. }
    18. }
    19. int main() {
    20. int array[3][4] = {
    21. {1, 2, 3, 4},
    22. {5, 6, 7, 8},
    23. {9, 10, 11, 12}
    24. };
    25. // 作为函数参数传递二维数组
    26. processArray(array, 3);
    27. // 作为函数参数传递数组指针
    28. processPointer(array, 3);
    29. return 0;
    30. }

     

  • 相关阅读:
    敏捷发布列车初探3 ---- Agile Release Train
    Libgdx游戏开发(3)——通过柏林噪音算法地图随机地形
    Windows 11 Beta 预览版用户已经可以体验 Android 应用
    python轻量规则引擎rule-engine入门与应用实践
    Rust区块琏开发——签名加密与私钥公钥
    JavaScript之数组常用API
    OCR——图像超分调研
    【阅读】《法治的细节》笔记整理
    智慧电力运维系统助力实现配电室无人值守
    C++核心编程——5 文件操作
  • 原文地址:https://blog.csdn.net/Phofomy/article/details/134251835