c语言 二维数组旋转90度 指针输入指针输出 使用指针偏移实现
时间: 2023-11-03 16:00:58 浏览: 73
下面是一个示例代码,使用指针偏移实现二维数组的旋转:
```c
#include <stdio.h>
void rotate(int **matrix, int n) {
// 指针偏移实现旋转
for (int i = 0; i < n / 2; i++) {
for (int j = i; j < n - i - 1; j++) {
int temp = *(*(matrix + i) + j);
*(*(matrix + i) + j) = *(*(matrix + n - j - 1) + i);
*(*(matrix + n - j - 1) + i) = *(*(matrix + n - i - 1) + n - j - 1);
*(*(matrix + n - i - 1) + n - j - 1) = *(*(matrix + j) + n - i - 1);
*(*(matrix + j) + n - i - 1) = temp;
}
}
}
int main() {
int n;
printf("请输入矩阵的大小:");
scanf("%d", &n);
int **matrix = (int **) malloc(n * sizeof(int *));
for (int i = 0; i < n; i++) {
matrix[i] = (int *) malloc(n * sizeof(int));
printf("请输入第%d行的%d个元素:", i + 1, n);
for (int j = 0; j < n; j++) {
scanf("%d", *(matrix + i) + j);
}
}
printf("旋转前的矩阵:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", *(*(matrix + i) + j));
}
printf("\n");
}
rotate(matrix, n);
printf("旋转后的矩阵:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", *(*(matrix + i) + j));
}
printf("\n");
}
return 0;
}
```
该程序使用了 `int **matrix` 来表示二维数组,其中第一维是行数,第二维是列数。在主函数中,我们首先通过动态内存分配来创建一个大小为 `n` 的二维数组,并从标准输入中读取矩阵元素。然后,我们调用 `rotate` 函数来旋转矩阵,并输出旋转前后的矩阵。
在 `rotate` 函数中,我们使用两个循环来依次旋转矩阵的每一层。对于当前层中的每个元素,我们使用指针偏移来交换其位置。具体来说,我们使用 `*(*(matrix + i) + j)` 来访问矩阵中第 `i` 行第 `j` 列的元素。为了实现旋转,我们需要将当前元素交换到其旋转后的位置。例如,对于一个 4x4 的矩阵,当我们处理第一层时,我们需要将 `(0, 0)` 的元素交换到 `(0, 3)` 的位置,将 `(0, 3)` 的元素交换到 `(3, 3)` 的位置,将 `(3, 3)` 的元素交换到 `(3, 0)` 的位置,将 `(3, 0)` 的元素交换到 `(0, 0)` 的位置。注意,我们在交换元素时需要使用一个临时变量来存储当前元素的值,以免被覆盖。
阅读全文