#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define ROWS 4
#define COLUMNS 5
typedef struct TwoDArray
{
int rows;
int columns;
int** elements;
} TwoDArray,*TwoDArrayPtr;
/*
指针可作为数组的首地址,设一个指向int指针的指针,
该指针可视为一个 int型指针的数组的首地址,其内部元
素为int指针,它们各自指向一个int数组,这样就构成了
一个二维数组
*/
typedef struct TwoDStaticArray
{
int rows;
int columns;
int elements[ROWS][COLUMNS];
} TwoDStaticArray,*TwoDStaticArrayPtr;
TwoDArrayPtr initTwoDArray(int paraRows,int paraColumns)
{
int i;
TwoDArrayPtr resultPtr=(TwoDArrayPtr)malloc(sizeof(TwoDArray));
resultPtr->rows =paraRows;
resultPtr->columns =paraColumns;
resultPtr->elements =(int**)malloc(sizeof(int*)*paraRows);
for(i=0;i<paraRows;i++)
{
resultPtr->elements[i]=(int*)malloc(sizeof(int)*paraColumns);
}
return resultPtr;
}
void randomizeTwoDArray(TwoDArrayPtr paraPtr,int paraLowerBound,int paraUpperBound)
{
int i,j;
for(i=0;i<paraPtr->rows;i++)
{
for(j=0;j<paraPtr->columns;j++)
{
paraPtr->elements[i][j]=rand()%(paraUpperBound-paraLowerBound)+paraLowerBound;
}
}
}
void printTwoDArray(TwoDArrayPtr paraPtr)
{
int i,j;
for(i=0;i<paraPtr->rows;i++)
{
for(j=0;j<paraPtr->columns;j++)
{
printf("%d, ",paraPtr->elements[i][j]);
}
printf("\r\n");
}
}
TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1,TwoDArrayPtr paraPtr2)
{
int i,j,k,sum;
if(paraPtr1->columns!=paraPtr2->rows)
{
printf("Matrices cannot be multiplied.\r\n");
return NULL;
}
TwoDArrayPtr resultPtr=initTwoDArray(paraPtr1->rows,paraPtr2->columns);
for(i=0;i<paraPtr1->rows;i++)
{
for(j=0;j<paraPtr2->columns;j++)
{
sum=0;
for(k=0;k<paraPtr1->columns;k++)
{
sum+=paraPtr1->elements[i][k]*paraPtr2->elements[k][j];
}
resultPtr->elements[i][j]=sum;
printf("sum = %d, ",sum);
}
}
return resultPtr;
}
void twoDArrayTest()
{
TwoDArrayPtr tempPtr1,tempPtr2,tempPtr3;
tempPtr1=initTwoDArray(3,2);
randomizeTwoDArray(tempPtr1,1,5);
printf("The first matrix:\r\n");
printTwoDArray(tempPtr1);
tempPtr2=initTwoDArray(2,4);
randomizeTwoDArray(tempPtr2,4,9);
printf("The first matrix:\r\n");
printTwoDArray(tempPtr2);
tempPtr3=matrixMultiply(tempPtr1,tempPtr2);
printf("The result:\r\n");
printTwoDArray(tempPtr3);
}
TwoDStaticArrayPtr initTwoDStaticArray()
{
int i,j;
TwoDStaticArrayPtr resultPtr=(TwoDStaticArrayPtr)malloc(sizeof(TwoDStaticArray));
resultPtr->rows=ROWS;
resultPtr->columns=COLUMNS;
for(i=0;i<ROWS;i++)
{
for(j=0;j<COLUMNS;j++)
{
resultPtr->elements[i][j]=i*10+j;
printf("(%d, %d): %p",i,j,&(resultPtr->elements[i][j]));
}
}
return resultPtr;
}
int main()
{
twoDArrayTest();
TwoDStaticArrayPtr tempPtr=initTwoDStaticArray();
return 1;
}