如何使用指针访问C中的2D数组中的任何元素?

时间:2012-06-26 13:16:36

标签: c arrays pointers multidimensional-array

我想使用指针

访问C中的2D数组中的元素 例如

(使用传统方式)

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) ;
                                }
                                  }

2 个答案:

答案 0 :(得分:1)

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

Refer the link

答案 1 :(得分:1)

您收到该特定错误消息的原因是变量multi的类型为int *,而不是int **。您的函数会在int **

中将其解除引用两次,从而将其视为*(*(multi + i ) + j)

打破表达式:

  1. *(multi + i)取消引用指针multi+i。因为multiint *类型,所以这很好。结果类型为int
  2. *( ... + j)尝试取消引用... + j。问题是...类型为int... + j类型为int。你不能取消引用int(它是一个整数类型,而不是一个指针)。
  3. 两种解决方案:

    1. multi声明为int **,并传入实际的int **
    2. multi保留为int *并使用单索引寻址
    3. 解决方案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接口(通常是数字代码),你应该更喜欢行主索引。