C 语言 关于二维数组 传参 总结

来源:岁月联盟 编辑:exp 时间:2012-09-12
 最近做矩阵运算处理,依据以往的懒想法,想直接搞一个 函数,可以传递 任何维数的矩阵进行运算。
 
所以,声明了这样一个函数:     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;
}
}
}

图片内容