//应该是版本问题,函数形参必须是二级指针,并不能按照书本答案对一级指针进行压扁数组操作
//如果必须要将形参定为一级指针,就采用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);
//}
8.8.5-PointersOnC-20220216
于 2022-02-16 09:45:23 首次发布