C语言实现二维数组逆时针旋转k次编译报错问题求解
C语言矩阵逆时针旋转编译问题修复
报错根因
你收到的类型转换警告完全是传参错误导致的:gridRotate函数第一个形参要求传入二维数组的首地址(类型为int (*)[4]),但你写的arr[ROW][COL]是尝试读取二维数组第4行第4列的int类型值,不仅下标越界(你定义的4行4列数组合法下标范围是0~3),类型也和形参要求完全不符,因此触发警告。
另外你的函数声明返回值为int,但函数内部没有返回任何数值,编译时会触发额外警告。
修复步骤
- 修改main函数里的调用语句,直接传二维数组名作为参数:把
gridRotate(arr[ROW][COL], 1);替换为gridRotate(arr, 1); - 修改函数返回值类型为void,适配无返回值的实现:将函数声明改为
void gridRotate(int grid[ROW][COL], int k);,函数定义头同步改为void gridRotate(int grid[ROW][COL], int k)
修复后完整代码
#include <stdio.h> #include <stdlib.h> #define ROW 4 #define COL 4 void gridRotate(int grid[ROW][COL], int k); int main() { int arr[ROW][COL] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}}; gridRotate(arr, 1); return 0; } void gridRotate(int grid[ROW][COL], int k){ int rst=0, ren=ROW-1, cst=0, cen=COL-1; int p1, p2, p3, p4; int tempK =k; for (; rst < ren && cst < cen; rst++, ren--, cst++, cen--) { tempK = k % (((ren - rst) * 2 +(cen - cst)) * 2); for (int t = 0; t < tempK; t++) { p1 = grid[rst][cst]; p2 = grid[ren][cst]; p3 = grid[ren][cen]; p4 = grid[rst][cen]; for (int i = ren - 1; i > rst; i--) grid[i + 1][cst] = grid[i][cst]; for (int i = cen - 1; i > cst; i--) grid[ren][i + 1] = grid[ren][i]; for (int i = rst+1 ; i < ren; i++) grid[i - 1][cen] = grid[i][cen]; for (int i = cst+1; i < cen; i++) grid[rst][i - 1] = grid[rst][i]; grid[rst + 1][cst] = p1; grid[ren][cst + 1] = p2; grid[ren - 1][cen] = p3; grid[rst][cen - 1] = p4; } } for(int i=0; i<ROW; i++){ for(int j=0; j<COL; j++){ printf("%d ",grid[i][j]); } printf("\n"); } }
运行效果
传入k=1时输出为逆时针旋转1个位置的4x4矩阵:
2 3 4 8 1 7 11 12 5 6 10 16 9 13 14 15
内容的提问来源于stack exchange,提问作者iamalaziz
相关产品推荐
相关产品推荐

