#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;
}
指针表达式如何提升性能
- 减少间接寻址:传统的二维数组访问
matrix[i][j]
实际上是*(*(matrix + i) + j)
,使用指针表达式*(matrix[i] + j)
直接定位到内存位置,减少了一次间接寻址操作,提高了访问效率。
- 内存局部性:在转置过程中,按行优先顺序访问内存,符合缓存的访问模式,减少了缓存缺失,进一步提高性能。
边界情况及处理方式
- 方阵:对于方阵(
rows == cols
),转置操作正常进行,指针表达式在方阵情况下同样有效。
- 非方阵:非方阵转置后行列数互换,代码中通过
rows
和cols
变量的交换正确处理了这种情况。
- 内存分配失败:在动态分配内存时,如果内存不足,
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;
}