MST

星途 面试题库

面试题:C语言指针表达式在内存管理与算法优化中的综合运用

设计一个程序,使用动态内存分配创建一个二维数组(模拟矩阵),数组大小由用户输入决定。要求通过指针表达式优化矩阵转置算法,在转置过程中尽量减少内存访问次数和临时变量的使用,以提高效率。请写出完整的代码,并详细阐述优化后的指针表达式如何提升性能,以及可能存在的边界情况和处理方式。
27.7万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>

void transposeMatrix(int** matrix, int rows, int cols) {
    for (int i = 0; i < rows; ++i) {
        for (int j = i + 1; j < cols; ++j) {
            // 指针表达式优化,直接通过指针访问和交换元素
            int temp = *(matrix[i] + j);
            *(matrix[i] + j) = *(matrix[j] + i);
            *(matrix[j] + i) = temp;
        }
    }
}

int main() {
    int rows, cols;
    std::cout << "请输入矩阵的行数: ";
    std::cin >> rows;
    std::cout << "请输入矩阵的列数: ";
    std::cin >> cols;

    // 动态内存分配创建二维数组
    int** matrix = new int*[rows];
    for (int i = 0; i < rows; ++i) {
        matrix[i] = new int[cols];
    }

    std::cout << "请输入矩阵元素:" << std::endl;
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            std::cin >> matrix[i][j];
        }
    }

    transposeMatrix(matrix, rows, cols);

    std::cout << "转置后的矩阵:" << std::endl;
    for (int i = 0; i < cols; ++i) {
        for (int j = 0; j < rows; ++j) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }

    // 释放内存
    for (int i = 0; i < rows; ++i) {
        delete[] matrix[i];
    }
    delete[] matrix;

    return 0;
}

指针表达式如何提升性能

  1. 减少间接寻址:传统的二维数组访问matrix[i][j]实际上是*(*(matrix + i) + j),使用指针表达式*(matrix[i] + j)直接定位到内存位置,减少了一次间接寻址操作,提高了访问效率。
  2. 内存局部性:在转置过程中,按行优先顺序访问内存,符合缓存的访问模式,减少了缓存缺失,进一步提高性能。

边界情况及处理方式

  1. 方阵:对于方阵(rows == cols),转置操作正常进行,指针表达式在方阵情况下同样有效。
  2. 非方阵:非方阵转置后行列数互换,代码中通过rowscols变量的交换正确处理了这种情况。
  3. 内存分配失败:在动态分配内存时,如果内存不足,new操作会抛出异常。可以通过在try - catch块中捕获异常,进行适当的错误处理,例如提示用户内存分配失败并终止程序。
try {
    int** matrix = new int*[rows];
    for (int i = 0; i < rows; ++i) {
        matrix[i] = new int[cols];
    }
} catch (const std::bad_alloc& e) {
    std::cerr << "内存分配失败: " << e.what() << std::endl;
    return 1;
}