-9

所以到目前为止我有以下代码:

#include <stdio.h>

int foo (int *pointer, int row, int col); 

int main() {
  int array[3][3] ={ {1,2,3},{4,5,6},{7,8,9}};

  int *pointer= array[0];

  int row = 2; 
  int col = 2; 

  int answer = foo (pointer, row, col); 

  printf("%d", answer); //prints 5 (which is wrong)
  printf("%d", array[2][2]); //prints 9
}

int foo (int *pointer, int row, int col){ //I don't want to use any square brackets here, unless I really have to. 
  int value; 
  value = *((int *)(pointer+row)+col); 

return value; 
}

所以我的主要问题是传递一个 2D 指针,请详细解释,因为我还是编码新手。我不想真正改变我传递的内容(因为我想在 foo(pointer, row, col) 中使用指针而不是 foo (array, row, col)。

4

2 回答 2

3

传递二维指针

从您(ab)使用术语的方式来看,很明显您错误地认为指针和数组是相同的。他们不是。

如果要使用指针访问多维数组,则必须指定其所有维度(第一个维度除外,最里面的维度除外)并正确使用指针算法,可能使用指向数组的指针,因为多维数组在内存中是连续的:

const size_t h = 2;
const size_t w = 3;
int arr[h][w] = {
    { 1, 2, 3 },
    { 4, 5, 6 }
};

int *p = &arr[1][2];
int *q = arr[1];
int (*t)[3] = &arr[1];
printf("arr[1][2] == %d == %d == %d\n", *p, q[2], (*t)[2]);

return 0;
于 2013-05-14T09:09:36.367 回答
1
int *pointer= array[0];

而不是使用这个

int *pointer= &array[0];

或者

int *pointer= array;
于 2013-05-14T09:08:29.723 回答