c语言 三维数组旋转90度,使用指针偏移实现
时间: 2023-12-08 09:50:40 浏览: 35
假设我们要将一个n x n x n的三维数组顺时针旋转90度,可以通过指针偏移实现。具体思路如下:
1. 首先定义一个临时数组temp,用于存储旋转后的结果。
2. 然后遍历原始数组,将原数组中的每个元素通过指针偏移,放入temp数组中对应的位置。
3. 最后将temp数组复制回原数组中。
代码实现如下:
```c
void rotate(int arr[][N][N], int n) {
int temp[N][N][N];
int *p, *q;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
p = &arr[i][j][k];
q = &temp[k][n-j-1][i];
*q = *p;
}
}
}
memcpy(arr, temp, sizeof(temp));
}
```
其中,p指针指向原始数组中的元素,q指针指向temp数组中对应的元素。通过指针偏移,将*p的值赋给*q。
最后使用memcpy()函数将temp数组复制回原数组中。
相关问题
c语言 三维数组旋转90度使用指针偏移实现,输入指针和输出指针 arr[3][4][5]
下面是使用指针偏移实现三维数组旋转90度的C语言代码:
```
void rotate_arr(int (*arr)[4][5], int (*out)[5][4][3]) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 5; k++) {
int *src = &arr[i][j][k];
int *dst = &out[2-k][j][i][0];
for (int l = 0; l < 3; l++) {
*dst = *src;
src += 5;
dst += 4;
}
}
}
}
}
```
其中,`arr`是输入指针,类型为`int (*)[4][5]`,表示一个3维数组,`out`是输出指针,类型为`int (*)[5][4][3]`,表示一个旋转后的3维数组。该函数实现的是将`arr`旋转90度后存储到`out`中。
在函数中,使用三重循环遍历`arr`中的每个元素,`src`指向当前元素的地址,`dst`指向旋转后的地址。具体实现时,每次将`src`向后移动5个元素的距离,将`dst`向后移动4个元素的距离,这样就能够正确地将原数组中的元素旋转后存储到新数组中了。
c语言 三维数组旋转90度,使用指针偏移实现,输入指针和输出指针
下面是一个使用指针偏移实现将三维数组旋转90度的代码:
```c
void rotate(int *in, int *out, int n) {
int i, j, k;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
for (k = 0; k < n; k++) {
*(out + k*n*n + j*n + n-i-1) = *(in + i*n*n + j*n + k);
}
}
}
}
```
其中,`in`是输入指针,`out`是输出指针,`n`是三维数组的边长。在循环中,通过指针偏移实现了将三维数组旋转90度的操作。具体来说,对于输入数组中的第`(i, j, k)`个元素,在输出数组中对应的位置是`(k, j, n-i-1)`。
使用示例:
```c
int main() {
int in[2][2][2] = {{{1, 2}, {3, 4}}, {{5, 6}, {7, 8}}};
int out[2][2][2];
rotate((int *)in, (int *)out, 2);
// 输出旋转后的数组
int i, j, k;
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
for (k = 0; k < 2; k++) {
printf("%d ", out[i][j][k]);
}
printf("\n");
}
printf("\n");
}
return 0;
}
```
输出结果:
```
5 1
6 2
7 3
8 4
```
注意,在将输入指针转化为`int *`类型时需要使用强制类型转换。