#include <stdio.h>
#include <stdlib.h>
// 创建二维数组的函数
int ** createMatrix(int rows, int cols) {
// 分配存放行指针的内存
int **matrix = (int **)malloc(rows * sizeof(int *));
if (matrix == NULL) {
return NULL;
}
for (int i = 0; i < rows; i++) {
// 为每一行分配内存
matrix[i] = (int *)malloc(cols * sizeof(int));
if (matrix[i] == NULL) {
// 如果某一行分配失败,释放之前分配的行指针内存
for (int j = 0; j < i; j++) {
free(matrix[j]);
}
free(matrix);
return NULL;
}
// 初始化每一行的元素为0
for (int j = 0; j < cols; j++) {
matrix[i][j] = 0;
}
}
return matrix;
}
// 释放二维数组内存的函数
void freeMatrix(int ** matrix, int rows) {
for (int i = 0; i < rows; i++) {
free(matrix[i]);
}
free(matrix);
}
// 定义函数指针类型
typedef int (*SumFunction)(int **);
// 计算二维数组所有元素和的函数
int sumMatrix(int ** matrix, int rows, int cols) {
int sum = 0;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
sum += matrix[i][j];
}
}
return sum;
}
int main() {
int rows = 3;
int cols = 3;
int **matrix = createMatrix(rows, cols);
if (matrix == NULL) {
printf("Memory allocation failed\n");
return 1;
}
// 赋值一些测试数据
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
matrix[i][j] = i + j;
}
}
// 使用函数指针调用计算和的函数
SumFunction sumFunc = sumMatrix;
int totalSum = sumFunc(matrix, rows, cols);
printf("The sum of matrix elements is: %d\n", totalSum);
freeMatrix(matrix, rows);
return 0;
}
指针表达式含义和作用解释
int **matrix = (int **)malloc(rows * sizeof(int *));
:
int **
表示 matrix
是一个指向指针的指针,用于模拟二维数组。
malloc(rows * sizeof(int *))
分配 rows
个 int *
类型大小的内存空间,即分配存放 rows
个行指针的内存。返回值是一个 void *
类型指针,需要强制转换为 int **
类型。这一步创建了二维数组的“骨架”,即每一行的指针。
matrix[i] = (int *)malloc(cols * sizeof(int));
:
- 对于每一个
matrix[i]
(即每一行的指针),malloc(cols * sizeof(int))
分配 cols
个 int
类型大小的内存空间,也就是为每一行分配存放具体元素的内存。同样,返回值需要强制转换为 int *
类型。
matrix[i][j]
:
- 这是访问二维数组元素的常见方式,本质上
matrix[i]
是指向第 i
行的指针,matrix[i][j]
等价于 *(matrix[i] + j)
,通过指针偏移 j
个 int
类型大小的位置,访问到第 i
行第 j
列的元素。
free(matrix[i]);
:
- 释放每一行分配的内存。
matrix[i]
是指向第 i
行内存的指针,调用 free
释放这部分内存。
free(matrix);
:
- 释放存放行指针的内存。
matrix
是指向存放行指针的内存块的指针,调用 free
释放这部分内存,完成整个二维数组内存的释放。
SumFunction sumFunc = sumMatrix;
:
SumFunction
是定义的函数指针类型,sumFunc
是该类型的变量,将 sumMatrix
函数的地址赋值给 sumFunc
,这样 sumFunc
就可以像函数名一样调用 sumMatrix
函数。
int totalSum = sumFunc(matrix, rows, cols);
:
- 通过函数指针
sumFunc
调用 sumMatrix
函数,计算二维数组所有元素的和,并将结果赋给 totalSum
。