什么是错传递一个二维数组到相应的指针参数?(What is wrong passing a 2D a

2019-10-22 16:56发布

我一直在做一些矩阵计算的下大学那天,我有一个5x5矩阵,开始用,所以我硬编码入来源。 这就像双打的2D阵列:

/**
 * 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的矩阵操作,所以我总是行和/或COLS的数量传递给该函数。 这迫使我不使用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*当我通过double [5][5]来代替。

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维的任意尺寸数组的函数的正确方法?

编辑:这清除了很多,为我: Accesing使用单一指针二维数组

所以,我应该只使用double[x*y]而不是double[x][y]我想。 但它是合法的投double[]double*

Answer 1:

我主张,有什么不对的,你做什么。 您的代码只是缺少一个明确铸造这将摆脱警告,说明你的任务是故意的。

可以通过指针访问的一个维阵列,以它的元件,并且递归地应用,它遵循n维矩阵可以通过指针到原子元素进行访问。

Ç保证他们的一个连续的存储器布局。 这种模式是常见的。 事实上传球阵列是很难或不可能有什么不同,给出的信息C商店的类型少(而不是,比方说,C#)。 因此,矩阵衰减到一个指向它的第一个元素(在你的情况下,以第一一门维阵列),它可以安全地被转换为它的第一元件,一个双重的地址。 他们都有着相同的数字地址。

与指针类型转换通常需要关注以下走样与现代的优化编译器问题(编译器可以假设你不通过不相关的类型除外的char *的指针访问内存),但在标准的1570草案,我有一个明确的豁免,比肩。 6.5.7,我认为这是适用在这里:

的对象[这将是一个双在你的矩阵,-PS]应当只有通过具有以下类型中的一个的左值表达式访问其存储的值:

- 与有效类型的对象的相容的类型[这将是一个解除引用的双指针,-PS] [...]

- 聚集体[例如阵列,-PS] [...]键入包含其成员(包括,递归地,一个子聚集的成员或包含联合)[这将是您的矩阵的变量,其中含有上述类型中的一种,最终,双打,-ps]

[...]



文章来源: What is wrong passing a 2D array to a respective pointer argument?
标签: c clang c99