设为首页 加入收藏

TOP

C 语言 关于二维数组 传参 总结
2014-11-23 23:36:27 来源: 作者: 【 】 浏览:4
Tags:语言 关于 二维数 传参 总结
最近做矩阵运算处理,依据以往的懒想法,想直接搞一个 函数,可以传递 任何维数的矩阵进行运算。

所以,声明了这样一个函数: 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;
}
}
}
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言--运算符优先级 下一篇排序算法(一) 选择排序

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: