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)
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 ,编译器必须计算指向行的指针的地址,读取该指针,然后才计算目标元素的地址.由于这种差异,两者不可互换.