面试题答案
一键面试#include <stdio.h>
void transpose(int (*arr)[4], int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = i + 1; j < cols; j++) {
int temp = *(*(arr + i) + j);
*(*(arr + i) + j) = *(*(arr + j) + i);
*(*(arr + j) + i) = temp;
}
}
}
int main() {
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
transpose(arr, 3, 4);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", *(*(arr + j) + i));
}
printf("\n");
}
return 0;
}
指针运算和间接访问操作符的使用逻辑:
int (*arr)[4]
:这是一个指向含有4个int
类型元素的数组的指针。arr
指向二维数组的首地址。*(arr + i)
:指针运算arr + i
,这里arr
是指向数组的指针,i
是偏移量。arr + i
会根据int [4]
数组的大小进行偏移,指向第i
行的数组。*(arr + i)
解引用这个指针,得到第i
行数组的首地址,此时类型等同于int *
。*(*(arr + i) + j)
:在*(arr + i)
得到第i
行数组首地址后,*(arr + i) + j
是在这一行内进行偏移,指向该行的第j
个元素。再通过外层的*
解引用,得到具体的元素值。
在转置操作中,通过*(*(arr + i) + j)
获取元素值进行交换,从而实现二维数组的转置。