一.源代码
二级指针在初始化时应注意,空间应分两次分配,先分配指向指针的指针空间,再分配一级指针的空间。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define ROWS 4
#define COLUMNS 5
typedef struct DArray{
int row;
int column;
int **element;
}TwoDArray, *TwoDArrayPtr;
typedef struct DstaticArray{
int row;
int column;
int element[ROWS][COLUMNS];
}DstaticArray, *DstaticPtr;
void initDArray(TwoDArrayPtr *paraPtr,int paraRows,int paraColumns){
*paraPtr=(TwoDArrayPtr)malloc(sizeof(TwoDArray));
(*paraPtr)->row=paraRows;
(*paraPtr)->column=paraColumns;
(*paraPtr)->element=(int**)malloc(paraRows*sizeof(int*));
int i;
for(i=0;i<paraRows;i++){
(*paraPtr)->element[i]=(int*)malloc(paraColumns*sizeof(int));
}
}
void initDstaticArray(DstaticPtr paraPtr,int paraRow,int paraColumn){
paraPtr=(DstaticPtr)malloc(sizeof(DstaticArray));
paraPtr->row=paraRow;
paraPtr->column=paraColumn;
int i,j;
for(i=0;i<ROWS;i++){
for(j=0;j<COLUMNS;j++){
paraPtr->element[i][j]=i*10+j;
printf("‘%d,%d’,%d",i,j,¶Ptr->element[i][j]);
}
}
}
void randArray(TwoDArrayPtr paraPtr,int lower,int upper){
int i,j;
for(i=0;i<paraPtr->row;i++){
for(j=0;j<paraPtr->column;j++){
paraPtr->element[i][j]=rand()%(upper-lower)+lower;
}
}
}
void printArray(TwoDArrayPtr paraPtr){
int i,j;
for(i=0;i<paraPtr->row;i++){
for(j=0;j<paraPtr->column;j++){
printf("%d ",paraPtr->element[i][j]);
}
printf("\r\n");
}
}
TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1, TwoDArrayPtr paraPtr2){
int i,j,k,sum;
TwoDArrayPtr paraPtr3;
initDArray(¶Ptr3,paraPtr1->row,paraPtr2->column);
if(paraPtr1->column!=paraPtr2->row){
printf("两个矩阵不能相乘!");
return NULL;
}
for(i=0;i<paraPtr1->row;i++){
for(j=0;j<paraPtr2->column;j++){
int sum=0;
for(k=0;k<paraPtr1->column;k++){
sum+=paraPtr1->element[i][k]*paraPtr2->element[k][j];
}
paraPtr3->element[i][j]=sum;
}
}
return paraPtr3;
}
void twoDArrayTest(){
TwoDArrayPtr tempPtr1, tempPtr2, tempPtr3;
initDArray(&tempPtr1,3, 2);
randArray(tempPtr1, 1, 5);
printf("The first matrix:\r\n");
printArray(tempPtr1);
initDArray(&tempPtr2,2, 3);
randArray(tempPtr2, 4, 9);
printf("The second matrix:\r\n");
printArray(tempPtr2);
tempPtr3 = matrixMultiply(tempPtr1, tempPtr2);
printf("The result:\r\n");
printArray(tempPtr3);
}
int main(){
twoDArrayTest();
DstaticPtr tempPtr;
initDstaticArray(tempPtr,2,4);
return 1;
}
测试结果
The first matrix:
2 4
3 1
2 1
The second matrix:
7 7 6
8 4 4
The result:
46 30 28
29 25 22
22 18 16
二.总结
这里二维数组给了两种初始化方式,一种是用指针动态分配空间,一种是用数组静态分配。
指针在未初始化时不能作为函数参数传入函数,应该传指针的地址给函数。
矩阵的相乘算法较简单,不再赘述。