MST

星途 面试题库

面试题:C++ 中数组指针与指针数组的深入剖析及应用

请详细说明 C++ 中数组指针和指针数组的定义、声明方式及内存布局。假设你要处理一个二维矩阵的操作,在哪些情况下使用数组指针更合适,哪些情况下使用指针数组更合适,给出具体的代码示例和解释。
42.1万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

数组指针

  • 定义:数组指针是一个指针,它指向一个数组。
  • 声明方式type (*pointer_name)[array_size];,例如 int (*ptr)[3]; 表示 ptr 是一个指向包含 3 个 int 类型元素的数组的指针。
  • 内存布局:数组指针本身占用一个指针大小的内存空间(通常在 32 位系统为 4 字节,64 位系统为 8 字节),它指向的数组在内存中是一块连续的内存区域,数组元素按顺序存储。

指针数组

  • 定义:指针数组是一个数组,数组的每个元素都是一个指针。
  • 声明方式type *array_name[array_size];,例如 int *arr[3]; 表示 arr 是一个包含 3 个 int 类型指针的数组。
  • 内存布局:指针数组本身占用 array_size 个指针大小的内存空间,每个指针可以指向不同的内存地址,这些地址所指向的数据在内存中不一定是连续的。

二维矩阵操作场景分析

使用数组指针更合适的情况

当二维矩阵的行数和列数在编译时就确定,并且矩阵的数据在内存中需要连续存储以提高缓存命中率,适合使用数组指针。例如,图像处理中固定尺寸的图像矩阵。

#include <iostream>
void processMatrixWithArrayPointer(int (*matrix)[3], int rows) {
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < 3; ++j) {
            matrix[i][j] *= 2;
        }
    }
}
int main() {
    int matrix[2][3] = { {1, 2, 3}, {4, 5, 6} };
    processMatrixWithArrayPointer(matrix, 2);
    for (int i = 0; i < 2; ++i) {
        for (int j = 0; j < 3; ++j) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }
    return 0;
}

解释:这里 processMatrixWithArrayPointer 函数接受一个指向包含 3 个 int 的数组的指针,因为矩阵列数固定为 3 且数据连续存储,操作起来效率较高。

使用指针数组更合适的情况

当二维矩阵的行数在运行时确定,或者每行的长度可能不同时,适合使用指针数组。例如,存储不同长度字符串的二维数组。

#include <iostream>
void processMatrixWithPointerArray(int **matrix, int rows) {
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < i + 1; ++j) {
            matrix[i][j] *= 2;
        }
    }
}
int main() {
    int *matrix[3];
    matrix[0] = new int[1];
    matrix[1] = new int[2];
    matrix[2] = new int[3];
    matrix[0][0] = 1;
    matrix[1][0] = 2; matrix[1][1] = 3;
    matrix[2][0] = 4; matrix[2][1] = 5; matrix[2][2] = 6;
    processMatrixWithPointerArray(matrix, 3);
    for (int i = 0; i < 3; ++i) {
        for (int j = 0; j < i + 1; ++j) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
        delete[] matrix[i];
    }
    return 0;
}

解释:processMatrixWithPointerArray 函数接受一个二级指针,因为每行长度不同,指针数组能灵活指向不同长度的内存区域。注意在使用完后需要手动释放内存。