void print_first_n_row(double **matrix, int n, int row_size) {
double (*abc)[row_size];
abc=matrix;}
我遇到了从不兼容指针类型[-Wincompatible-pointer-types] abc=matrix的赋值错误。我如何解决这个问题?
注意:这个答案只是关于错误信息,而不是向矩阵传递指针背后的逻辑。
"我遇到了从不兼容指针类型[-Wincompatible-pointer-types] abc=matrix的赋值错误。我如何解决这个问题?"
double (*abc)[row_size];
- abc
是指向一个数组的 double
.
double **matrix
- matrix
的指针,是一个指向 double
.
有不匹配的地方。*
与。**
.
你不能将一个指针的值赋给一个指向的指针。double
的指针,指向一个 double
.
变化 double (*abc)[row_size];
到 double **abc
或 double (**abc)[row_size];
或只用 matrix
如果 abc
否则就不需要了。
那么,答案是 matrix
和 abc
必须以同样的方式声明。 要么你需要将原型改为
void print_first_n_row(int n, int row_size, double (*matrix)[row_size]) // row_size needs to be defined first
{
double (*abc)[row_size] = matrix;
...
}
或者你需要改变 abc
到
double **abc;
这取决于你是如何调用定义参数的 matrix
对应,以及你如何调用 print_first_n_row
.
假设你的代码看起来像:
int main( void )
{
int rows = ...; // assumes rows and cols are set at runtime
int cols = ...;
...
double matrix[rows][cols];
...
print_first_n_rows( matrix, n, cols )
...
}
那么第一个解决方案是正确的,你需要把调用改为
print_first_n_rows( n, cols, matrix );
在其他答案中已经详细解释过,试图使用不兼容的类型进行赋值是错误的。即使编译器没有警告你,这些赋值也经常会导致未定义的行为。但是 在C语言中,多维数组被存储在单个连续的内存块中_,例如。
in array[4][2] = {{1,2,3,4},{5,6,7,8}};
在内存中是以单个顺序块的位置存储的。
|1|2|3|4|5|6|7|8|
不是 正如你所想象的那样,在多个块中。
|1|2|3|4|
|5|6|7|8|
因此,我们可以创建一个单一的指针变量,可以设置为 观点 到C数组中的任何位置(相同的基类型),例如,可以用来为该数组赋值,如下图所示,使用了 可变长度阵列:
int main(void)
{
print_first_n_row(4,2);// params to create 4X2 array
return 0;
}
void print_first_n_row(int r, int c)
{
double matrix[r][c]; //create array using Variable Length Array
double *abc = &matrix[0][0];//create pointer of same base type
//and set address to pointer to point to
//first location of matrix
printf("%s", "array contents:");
for(int i=0; i<r*c; i++)
{
*(abc + i) = i*i;
printf("%0.2f,", *(abc + i));
}
}
或者,与你传递数组作为参数的例子一样,只要类型相同,使用指针在数组位置上做索引的能力也是正确的。
传递数组参数:
void print_first_n_row(double matrix[4][2]);
int main(void)
{
double array1[4][2] = {1,2,3,4,5,6,7,8};
print_first_n_row(array1);
return 0;
}
void print_first_n_row(double matrix[4][2])
{
double *abc = &matrix[0][0];//create pointer of same base type
//and set address to pointer to point to
//first location of matrix
...(same as first example)