C语言二维数组如何实现行顺序逆序(上下翻转)
二维数组行级上下翻转实现方案(C语言)
核心实现思路
你需要的是整行维度的逆序排列,不需要修改每行内部的元素顺序,核心逻辑为:将第i行和第总行数-1 -i行的完整数据直接交换,仅需遍历前一半行数即可完成操作,时间复杂度为O(n)(n为二维数组总元素数),原地交换方案无额外内存开销。
具体实现代码
场景1:静态二维数组(编译时确定行列数)
静态数组的行内存是连续分配的,直接通过memcpy交换整行数据即可:
#include <stdio.h> #include <string.h> int main() { // 原二维数组 int arr[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; int rows = sizeof(arr) / sizeof(arr[0]); // 自动计算总行数 int cols = sizeof(arr[0]) / sizeof(arr[0][0]); // 自动计算总列数 int temp[cols]; // 临时存储一整行数据 // 仅循环前一半行数,避免重复交换 for (int i = 0; i < rows / 2; i++) { // 交换第i行和倒数第i+1行 memcpy(temp, arr[i], cols * sizeof(int)); memcpy(arr[i], arr[rows - 1 - i], cols * sizeof(int)); memcpy(arr[rows - 1 - i], temp, cols * sizeof(int)); } // 打印验证结果 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", arr[i][j]); } printf("\n"); } return 0; }
场景2:动态指针型二维数组(运行时确定行列数)
动态申请的指针数组仅需交换行指针地址即可,无需复制整行数据,执行效率更高:
#include <stdio.h> #include <stdlib.h> int main() { int rows = 3, cols = 3; // 动态申请二维数组 int** arr = (int**)malloc(rows * sizeof(int*)); for (int i = 0; i < rows; i++) { arr[i] = (int*)malloc(cols * sizeof(int)); } // 初始化数组 arr[0][0] = 1; arr[0][1] = 2; arr[0][2] = 3; arr[1][0] = 4; arr[1][1] = 5; arr[1][2] = 6; arr[2][0] = 7; arr[2][1] = 8; arr[2][2] = 9; // 直接交换行指针完成逆序 for (int i = 0; i < rows / 2; i++) { int* temp = arr[i]; arr[i] = arr[rows - 1 - i]; arr[rows - 1 - i] = temp; } // 打印验证+释放内存 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%d ", arr[i][j]); } printf("\n"); free(arr[i]); } free(arr); return 0; }
注意事项
- 不要和行内元素反转逻辑混淆,行内反转需要遍历每行内部交换对应位置元素,本需求不需要修改行内元素顺序
- 循环次数仅需到总行数的1/2即可,若遍历全部行数会把已经交换的行再次换回原始顺序
- 如果不需要保留原数组,优先使用原地交换方案,无需额外申请内存存储新数组
内容的提问来源于stack exchange,提问作者user419050
相关产品推荐
相关产品推荐

