在函数[复制]中,通过指向多维数组的指针来分配一个指针。

问题描述 投票:3回答:4
void print_first_n_row(double **matrix, int n, int row_size) {
 double (*abc)[row_size];
 abc=matrix;}

我遇到了从不兼容指针类型[-Wincompatible-pointer-types] abc=matrix的赋值错误。我如何解决这个问题?

c pointers matrix multidimensional-array pointer-to-pointer
4个回答
4
投票

矩阵是一个 抽象数据类型. 如何实现它是一个实施细节。

这个 回答中我详细介绍了如何在C语言中实现这样一个类型。

多维数组在C语言中并不真正存在。 C只是有数组的数组,或者指针的数组--或者其他类型,包括标量的数组。通过阅读 n1570 (C11标准)。

我遇到了从不兼容指针类型[-Wincompatible-pointer-types]abc=matrix的赋值错误。我该如何解决这个问题?

要么用抽象的数据类型来思考,要么多读一些关于C11标准的文章。动态内存分配 (考虑使用 弹性数组成员)和约 C语言.

你会发现许多与矩阵相关的源代码的例子,在 githubgitlab 和其他地方。


3
投票

注意:这个答案只是关于错误信息,而不是向矩阵传递指针背后的逻辑。


"我遇到了从不兼容指针类型[-Wincompatible-pointer-types] abc=matrix的赋值错误。我如何解决这个问题?"

double (*abc)[row_size]; - abc 是指向一个数组的 double.

double **matrix - matrix 的指针,是一个指向 double.

有不匹配的地方。* 与。**.

你不能将一个指针的值赋给一个指向的指针。double 的指针,指向一个 double.

变化 double (*abc)[row_size];double **abcdouble (**abc)[row_size]; 或只用 matrix 如果 abc 否则就不需要了。


2
投票

那么,答案是 matrixabc 必须以同样的方式声明。 要么你需要将原型改为

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

1
投票

在其他答案中已经详细解释过,试图使用不兼容的类型进行赋值是错误的。即使编译器没有警告你,这些赋值也经常会导致未定义的行为。但是 在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)
© www.soinside.com 2019 - 2024. All rights reserved.