最近做矩陣運算處理,依據以往的懶想法,想直接搞一個 函數,可以傳遞 任何維數的矩陣進行運算。
所以,聲明了這樣一個函數: void matrix_mult(float **p);
然後再主函數中 聲明了 一個 二維數組float a[3][3];
進而在使用時這樣:matrix_mult(a);
之後悲劇,編譯器提示:cannot convert parameter 1 from 'float [3][3]' to 'float ** '
有錯誤。
改正方法:
matrix_mult(float (*p)[N]);//N 為聲明二維數組第二維的大小值,然後再進行傳參:matrix_mult(a);OK了。
總結:這是一個老生常談的問題:關於數組和指針
說明:
指針是一個變量名,而數組不是變量名,數組跟接近於一種結構體。
例子:
int *p; int a[2]; p = a;
int n = sizeof(p);//
int len = sizeof(a);
n 的值為4,而len的值為8;
int a[10][20]; //真正的二維數組,
int *b[10]; //定義分配了10個指針,沒有初始化。換句話說,b是一個由10個整型(int)指針構成的指針數組。
int (*p)[3];//指向數組的指針
int (*p)();//指向函數的指針
int *p();//p是一個函數,返回值是一個int型指針
float ** 這裡的p不是二維數組的指針,而是指向指針的指針,即二級指針。
正確的二維數組的指針應該是:Int a[2][2];Int (*p)[2];//定義時無論數組維數,只可忽略第一維
二維數組其實只是一個指針,而二級指針是指向指針的指針,所以二者並不等價
附:code
/*----------------------------------------------------------------------------------*/
/*說明:此函數可以直接進行矩陣3x3的乘法,經過驗證 */
/*----------------------------------------------------------------------------------*/
#include "stdlib.h"
#include "stdio.h"
#include "math.h"
void matrix_mult(float (*a)[3], float (*b)[3], float (*c)[3]);
void matrix_init(float (*a)[3]);
float a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
float b[3][3] = {2, 3, 4, 5, 6, 7, 8, 9, 1};
float c[3][3] = {0};
int main()
{
int i , j;
int t[2];
int *p;
p = t;
int n = sizeof(p);
int len = sizeof(t);
printf("原始數組C的值為:\n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
printf("%f ", c[i][j]);
}
printf("\n");
}
printf("\n");
printf("原始數組A的值為:\n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
printf("%f ", a[i][j]);
}
printf("\n");
}
printf("\n");
printf("原始數組B的值為:\n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
printf("%f ", b[i][j]);
}
printf("\n");
}
printf("\n");
//初始化數據
matrix_init(c);//matrix_init((*c)[3]);
//matrix_init((*c)[3]);
printf("初始化數組C的值為:\n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
printf("%f ", c[i][j]);
}
printf("\n");
}
printf("\n");
matrix_mult(a, b, c);//matrix_mult(float (*a)[3], float (*b)[3], float (*c)[3])
//matrix_mult((*a)[3], (*b)[3], (*c)[3]);
printf("相乘後數組C的值為:\n");
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
printf("%f ", c[i][j]);
}
printf("\n");
}
printf("\n");
return 0;
}
void matrix_mult(float (*a)[3], float (*b)[3], float (*c)[3])
{
int i, j, k;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
{
for(k = 0; k < 3; k++)
{
c[i][j] += a[i][k] * b[k][j];
}
}
}
}
void matrix_init(float (*a)[3])
{
int i = 3;
int j = 3; www.2cto.com
for(i = 2; i >= 0; i--)
{
for(j = 2; j >= 0; j--)
{
a[i][j] = 0;
}
}
}