将2D数组传递给相应的指针参数有什么问题?

前几天我在C大学做了一些矩阵计算,我开始使用5×5矩阵,所以我把它硬编码到源代码中。 这是一个二维的二维数组,如:

/** * This is the probability-matrix for reaching from any profile * to another by randomly selecting a friend from the friendlist. */ static const double F[5][5] = { /* P , F , L , A , S */ /* Peter */ {0 , 0.5 , 0.5 , 0 , 0 }, /* Franz */ {1.0 , 0 , 0 , 0 , 0 }, /* Lisa */ {0 , 1/3.0, 0 , 1/3.0, 1/3.0}, /* Anna */ {0 , 0 , 0 , 0 , 1 }, /* Sepp */ {0 , 0.5 , 0.5 , 0 , 0 } }; 

我希望我的函数不被修复以在5乘5矩阵上运行,所以我总是将行数和/或列数传递给函数。 这迫使我不要使用double [][X]语法,因为它不能完全“变量”,而是使用double*作为函数参数。

 inline size_t matrix_get(int rows, int i, int j); inline void matrix_print(double* m, int rows, int cols); inline void matrix_copy(double* d, const double* s, int rows, int cols); void matrix_multiply( int m, int n, int l, const double* a, const double* b, double* d); 

但是当我通过double [5][5]而调用一个接受double*的函数时,我总是得到这个警告。

 fuenf_freunde.c:138:17: warning: incompatible pointer types passing 'double [5][5]' to parameter of type 'double *' [-Wincompatible-pointer-types] matrix_print( R, 5, 5); ^ fuenf_freunde.c:54:27: note: passing argument to parameter 'm' here void matrix_print(double* m, int rows, int cols) ^ 

使用(double*) F投射可以解决警告问题。

现在我的问题是

  • 我错误地将2D双数组转换为双指针?
  • 为什么它是非法的?
  • 将n维任意大小的数组传递给函数的正确方法是什么?

编辑:这为我清理了很多: 使用单个指针访问2D数组

所以我应该使用double[x*y]而不是double[x][y]我想。 但是将double[]double*是合法的吗?

我认为你做的事情没有错。 你的代码只缺少一个明确的演员表,可以摆脱警告,表明你的作业是故意的。

您可以通过指向其元素的指针访问一维数组,并递归应用,可以通过指向primefaces元素的指针访问n维矩阵。

C保证为它们提供连续的内存布局。 这种模式很常见。 实际上,传递数组很难或不可能做到不同,因为C存储的信息很少(与C#相反)。 因此,矩阵衰减到指向其第一个元素的指针(在您的情况下是第一个一维数组),可以安全地转换为其第一个元素的地址,即double。 它们都共享相同的数字地址。

指针类型转换的典型问题是现代优化编译器的别名问题(编译器可以假设您不通过除char *之外的不相关类型的指针访问内存),但是我在标准草案1570中有明确的豁免,比肩。 6.5.7,我认为适用于此:

对象[在矩阵中为双精度型,-ps]的存储值只能由具有以下类型之一的左值表达式访问:

– 与对象的有效类型兼容的类型[将是一个解除引用的双指针,-ps] […]

– 聚合[例如数组,-ps] […]类型,其中包含其成员中的上述类型之一(包括递归地,子聚合或包含联合的成员)[这将是您的矩阵变量,包含,最终,双打,-ps]

[…]