二维数组定义
二维数组可以定义成静态和动态,我们分别定义,另外实现二维数组的打印、乘积、随机生成二维数组、初始化,这些我们用动态二维数组实现,而静态其实是一样的,另外我们思考二维数组的地址。
动态:一个二维数组指针(二级)指向一片空间,这片空间存储的是每行的指针地址,有几行就有几个指针,这些指针分别指向每行的首地址(如图)。
代码
typedef struct TwoDArray{
int rows;
int columns;
int** elements;
}TwoDArray, *TwoDArrayPtr;//初始化·
TwoDArrayPtr initTwoDArray(int paraRows, int paraColumns){
int i;
TwoDArrayPtr resultPtr = (TwoDArrayPtr)malloc(sizeof(TwoDArray));
resultPtr->columns = paraColumns;
resultPtr->rows = paraRows;
resultPtr->elements = (int**)malloc(sizeof(int*) * paraRows);
for (i = 0; i < paraRows; i++) {
resultPtr->elements[i] = (int*)malloc(sizeof(int) * paraColumns);
}//Of for(i)
return resultPtr;
}
静态:分配一片连续的空间,它的大小为:行*列*单个元素大小(如图:)
定义:
typedef struct TwoDStaticArray{
int rows = ROWS;
int columns = COLUMNS;
int elements[ROWS][COLUMNS];
}TwoDStaticArray, *TwoDStaticArrayPtr;
二维数组的乘积:
A的第一行的每个元素依次乘B的第一列每个元素的和为新数组的(1,1),然后A的第一行的每个元素乘B的第二列的每个元素的和为新数组的(1,2)以此类推。
代码实现:
TwoDArrayPtr martixMultiply(TwoDArrayPtr paraPtr1, TwoDArrayPtr paraPtr2) {
int sum;
//Step 1.is right.
if (paraPtr1->columns != paraPtr2->rows) {
printf("Matrices cannot be multiplied.\n");
return NULL;
}
//Step 2.mul
TwoDArrayPtr resultPtr = initTwoDArray(paraPtr1->rows, paraPtr2->columns);
for (int i = 0; i < paraPtr1->rows; i ++) {
for (int j = 0; j < paraPtr2->columns; j++) {
sum = 0;
for (int k = 0; k < paraPtr1->columns; k++) {
sum += (paraPtr1->elements[i][k] * paraPtr2->elements[k][j]);
}
resultPtr->elements[i][j] = sum;
printf("sum = %d ", sum);
}//of for j
}//of for i
return resultPtr;
}