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

本文详细解析了C++中二维数组与指针的区别与使用方法,通过实例展示了如何正确地传递二维数组给函数,并解决传参过程中出现的类型转换错误。文章旨在帮助开发者更准确地掌握C++中的指针与数组操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近做矩阵运算处理,依据以往的懒想法,想直接搞一个 函数,可以传递 任何维数的矩阵进行运算。

所以,声明了这样一个函数:     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;

for(i = 2; i >= 0; i--)
{
for(j = 2; j >= 0; j--)
{
a[i][j] = 0;
}
}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值