我想使用指针
访问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) ;
}
}
答案 0 :(得分:1)
((多+ 0)+1)没问题。它会起作用。请指定完整代码以找出错误。
答案 1 :(得分:1)
您收到该特定错误消息的原因是变量multi
的类型为int *
,而不是int **
。您的函数会在int **
*(*(multi + i ) + j)
打破表达式:
*(multi + i)
取消引用指针multi+i
。因为multi
是int *
类型,所以这很好。结果类型为int
。*( ... + j)
尝试取消引用... + j
。问题是...
类型为int
,... + j
类型为int
。你不能取消引用int
(它是一个整数类型,而不是一个指针)。两种解决方案:
multi
声明为int **
,并传入实际的int **
multi
保留为int *
并使用单索引寻址解决方案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接口(通常是数字代码),你应该更喜欢行主索引。