-1

我想使用指针访问 C 中二维数组中的元素

例如(这使用传统方式)

multi[0][1] = ....

我试过这种方式

*(*(multi+0)+1) = ....

但它给了我一个错误说

" pointer required "

那我该怎么办?

其实这就是我正在做的

void state_array(int *pointer , int *multi){
   int i ;
   for ( i = 0 ; i < 4 ; i++){
   *(*(multi + i) + 0 )= *(pointer+i) ;
                                }
     for ( i = 4 ; i < 8 ; i++){
   *(*(multi + i ) + 1 )= *(pointer+i) ;
                                }
    for ( i = 8 ; i < 12 ; i++){
   *(*(multi + i ) + 2 )= *(pointer+i) ;
                                }
   for ( i = 12 ; i < 16 ; i++){
   *(*(multi + i ) + 3 )= *(pointer+i) ;
                                }
                                  }
4

2 回答 2

1

您收到该特定错误消息的原因是变量multi是 type int *,而不是int **。您的函数int **通过将其取消引用两次来将其视为*(*(multi + i ) + j)

分解表达式:

  1. *(multi + i)取消引用指针multi+i。因为multi是 type int *,这很好。结果类型是int.
  2. *( ... + j)试图取消引用... + j. 问题在于,...是类型int,而且... + j是类型int。你不能取消引用int(它是一个整数类型,而不是一个指针)。

两种解决方案:

  1. 声明multi为 type int **,并传入一个实际的int **
  2. 保留multiint *使用单索引寻址

解决方案 1 仅在您分配 的数组int *然后填充它以指向的数组时才有效int。如果您在 C 中声明一个多维数组(即) ,它将不起作用int myarray[23][78]。在 C 中,声明的多维数组保存在连续的内存中,如果将其作为指向指针的指针传递给函数,则此信息会丢失。

第二种解决方案是选择行优先或列优先索引,并传入相关大小。无论如何,您可能应该这样做。如果您选择行主要索引(行在内存中是连续的),则 M x N 矩阵multi被寻址为

multi[i + M*j]

如果您选择列优先索引(列在内存中是连续的),则相同的矩阵被寻址为

multi[N*i + j]

该解决方案适用于 C 中静态声明的多维数组,并允许您以最小的开销在 C 中动态分配多维数组。

另外,请注意 C 中静态声明的多维数组在以mat[i][j]. 但是,如果您正在做认真的矩阵工作,那么有充分的理由更喜欢行优先索引。最后,Fortran 使用行优先索引,如果您的代码需要与 Fortran 交互(就像数字代码经常做的那样),您可能应该更喜欢行优先索引。

于 2012-06-26T14:23:21.980 回答
1

( (multi+0)+1)没有问题。它会起作用的。请指定完整代码以找出错误。

参考链接

于 2012-06-26T13:27:00.030 回答