Appearance
问题描述
(南华仪器 2023)
cpp
#include <stdio.h>
void move(int* pointer) {}
int main() {
int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int *p, i;
printf("Input matrix:\n");
for (i = 0; i < 3; i++)
printf("% d % d % d\n", a[i][0], a[i][1], a[i][2]);
p = &a[0][0];
move(p);
printf("Now, matrix :\n");
for (i = 0; i < 3; i++)
printf("% d % d % d\n", a[i][0], a[i][1], a[i][2]);
}编写 move 函数,使得结果为:
txt
Input matrix:
1 2 3
4 5 6
7 8 9
Now, matrix :
1 4 7
2 5 8
3 6 9问题解答
cpp
void move(int* pointer) {
int* p = pointer;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < i; j++) {
int temp = *(p + i * 3 + j);
*(p + i * 3 + j) = *(p + j * 3 + i);
*(p + j * 3 + i) = temp;
}
}
}转换方法很简单。但这里只能使用 *(p + i * 3 + j) ,不能将 pointer 取为 int** p 并使用 p[i][j](陷阱)。因为数组变量作为指针传入函数时候,会失去记录数组宽度数据。但不管数据是几维的,它在内存中的地址都是连续的,所以可以手动计算偏移量。