不是double [] []相当于**double?

use*_*813 34 c++ pointers matrix multidimensional-array

我问这个是因为我的程序有两个函数来乘法矩阵,它们只乘以4x4和4x1矩阵.标题是:

 double** mult4x1(double **m1, double **m2);
 double** mult4x4(double **m1, double **m2);
Run Code Online (Sandbox Code Playgroud)

它们执行m1*m2并将其返回**两倍,下面是4x4乘法的片段.

 double** mult4x4(double **m1, double **m2){
      double** result = (double**) malloc(sizeof(double)*4);
      for (int i = 0; i < 4; i++) {
           result[i] = (double*) malloc(sizeof(double)*4);
      }
      ...multiply...
      return result;
 }
Run Code Online (Sandbox Code Playgroud)

mult4x1和mult4x4之间的区别仅在于它们内部使用的索引.

我有这3个矩阵:

double m1[4][4] = {
    {2, 3, 5, 6},
    {9, 8, 1, 7},
    {5, 4, 3, 1},
    {7, 6, 1, 2}
};

double m2[4][4] = {
    {1, 0, 0, 0},
    {0, 1, 0, 0},
    {0, 0, 1, 0},
    {0, 0, 0, 1}
};

double m3[4][1] = {
    {2},
    {3},
    {3},
    {1}
};
Run Code Online (Sandbox Code Playgroud)

试图乘以这些矩阵时会发生错误.

double** test = mult4x4(m1, m2);
double** test2 = mult4x1(identity4x4(), m3);
//identity4x4() creates a 4x4 identity matrix - double** identity4x4();
Run Code Online (Sandbox Code Playgroud)

产量:

错误:无法转换double (*)[4]' todouble*'参数1' todouble*mult4x4(double*,double*)'

错误:无法转换double (*)[1]' todouble*'参数2' todouble*mult4x1(double*,double*)'

是不是double [] []应该等于**double?一个double数组的数组.欢迎任何澄清,误解和错误.

Yoc*_*mer 51


double**是一个指针的指针为双(double*).

所以实际上它应该像这样创建(注意第一个malloc sizeof()中的额外*):

  double** result = (double**) malloc(sizeof(double*)*4);
  for (int i = 0; i < 4; i++) {
       result[i] = (double*) malloc(sizeof(double)*4);
  }
Run Code Online (Sandbox Code Playgroud)

所以在内存中它看起来像这样:

[] -> { d,d,d,d }
[] -> { d,d,d,d }
[] -> { d,d,d,d }
[] -> { d,d,d,d }
Run Code Online (Sandbox Code Playgroud)

有4个缓冲区可容纳4个双打,但不是连续的.

你的double [4] [4]是内存中的连续缓冲区,如下所示:

 { { d,d,d,d } { d,d,d,d } {d,d,d,d} {d,d,d,d} }
Run Code Online (Sandbox Code Playgroud)

  • 视觉部分显然有助于理解两个声明之间的区别. (2认同)

das*_*ght 24

虽然两者double[N][M]double**让你处理二维数组,这两个是绝对不等同的:前者代表的二维数组doubleS,而后者代表的指针指向double,它可以解释(与便利方括号语法的帮助C/C++)作为指向数组double或作为数组的数组double.

double[N][M]表示"矩形"形状的2D阵列,而double**允许通过到您的矩阵的每一行不同量的存储器分配建立"自由形式"(锯齿状)阵列.

与编译器的区别在于给定double[N][M]和一对整数,{r,c}它可以通过计算从数组原点的偏移量来计算元素的位置,而无需从内存中读取任何内容.double**但是,给定a ,编译器必须计算指向行的指针的地址,读取该指针,然后才计算目标元素的地址.由于这种差异,两者不可互换.