Skip to content
On this page

面试题_01二维数组指针


标签:面试题/clang  

问题描述

(南华仪器 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](陷阱)。因为数组变量作为指针传入函数时候,会失去记录数组宽度数据。但不管数据是几维的,它在内存中的地址都是连续的,所以可以手动计算偏移量。

Last updated: