MST

星途 面试题库

面试题:C语言指针与间接访问操作符的复杂操作

假设有一个二维数组`int arr[3][4]`,通过指针和间接访问操作符,实现对该数组的转置操作(即将行和列元素互换),请编写完整代码,并解释其中指针运算和间接访问操作符的使用逻辑。
26.2万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#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;
}

指针运算和间接访问操作符的使用逻辑:

  1. int (*arr)[4]:这是一个指向含有4个int类型元素的数组的指针。arr指向二维数组的首地址。
  2. *(arr + i):指针运算arr + i,这里arr是指向数组的指针,i是偏移量。arr + i会根据int [4]数组的大小进行偏移,指向第i行的数组。*(arr + i)解引用这个指针,得到第i行数组的首地址,此时类型等同于int *
  3. *(*(arr + i) + j):在*(arr + i)得到第i行数组首地址后,*(arr + i) + j是在这一行内进行偏移,指向该行的第j个元素。再通过外层的*解引用,得到具体的元素值。

在转置操作中,通过*(*(arr + i) + j)获取元素值进行交换,从而实现二维数组的转置。