8.8.5-PointersOnC-20220216

//应该是版本问题,函数形参必须是二级指针,并不能按照书本答案对一级指针进行压扁数组操作
//如果必须要将形参定为一级指针,就采用void *的方法
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void matrix_multiply(int **m1,int **m2,int **r,int x,int y,int z);
//void matrix_multiply(void *m1,void *m2,void *r,int x,int y,int z);
int main(){
	srand((unsigned int)time(0)*1000);
	int x=0,y=0,z=0;
	int **matrix_a=NULL,**matrix_b=NULL,**matrix_c=NULL;
	fputs("Please input the value of x,y,z,divide with space.\nx y z:->",stdout);
	for(int ch=0;(ch=scanf_s("%d %d %d",&x,&y,&z))!=3||x<=0||y<=0||z<=0;fputs("Wrong!Again!x y z:->",stdout))
		while((ch=getchar())!=EOF&&ch!=10);
	matrix_a=(int **)calloc(x,sizeof(int *));//动态内存生成二维数组
	matrix_b=(int **)calloc(y,sizeof(int *));
	matrix_c=(int **)calloc(x,sizeof(int *));
	for(int i=0;i<x;*(matrix_a+i)=(int *)calloc(y,sizeof(int)),i++);
	for(int i=0;i<y;*(matrix_b+i)=(int *)calloc(z,sizeof(int)),i++);
	for(int i=0;i<x;*(matrix_c+i)=(int *)calloc(z,sizeof(int)),i++);
	for(int i=0;i<x;i++)//对A、B生成随机值
		for(int j=0;j<y;*(*(matrix_a+i)+j)=rand()%10-5,j++);
	for(int i=0;i<y;i++)
		for(int j=0;j<z;*(*(matrix_b+i)+j)=rand()%10-5,j++);
	matrix_multiply(matrix_a,matrix_b,matrix_c,x,y,z);
	fputs("matrix_a:\n",stdout);//显示
	for(int i=0;i<x;fputc(10,stdout),i++)
		for(int j=0;j<y;j++)
			printf("%d ",matrix_a[i][j]);
	fputc(10,stdout);
	fputs("matrix_b:\n",stdout);
	for(int i=0;i<y;fputc(10,stdout),i++)
		for(int j=0;j<z;j++)
			printf("%d ",matrix_b[i][j]);
	fputc(10,stdout);
	fputs("matrix_c:\n",stdout);
	for(int i=0;i<x;fputc(10,stdout),i++)
		for(int j=0;j<z;j++)
			printf("%d ",matrix_c[i][j]);
	for(int i=0;i<x;free(*(matrix_a+i)),*(matrix_a+i)=NULL,i++);//清空动态内存
	for(int i=0;i<y;free(*(matrix_b+i)),*(matrix_b+i)=NULL,i++);
	for(int i=0;i<x;free(*(matrix_c+i)),*(matrix_c+i)=NULL,i++);
	free(matrix_a);
	matrix_a=NULL;
	free(matrix_b);
	matrix_b=NULL;
	free(matrix_c);
	matrix_c=NULL;
}
//
void matrix_multiply(int **m1,int **m2,int **r,int x,int y,int z){
	for(int i=0;i<x;i++)
		for(int j=0;j<z;j++)
			for(int k=0;k<y;k++)
				*(*(r+i)+j)+=*(*(m1+i)+k)**(*(m2+k)+j);
}
//void matrix_multiply(void *m1,void *m2,void *r,int x,int y,int z){
//	for(int i=0;i<x;i++)
//		for(int j=0;j<z;j++)
//			for(int k=0;k<y;k++)
//				*(*((int **)r+i)+j)+=*(*((int **)m1+i)+k)**(*((int **)m2+k)+j);
//}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fleet1126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值