*(*(p+i)+j)
C语言二维数组最大值查找程序详解
程序功能概述
这个程序的主要功能是在一个二维数组中找到最大值,并返回该最大值以及它在数组中的位置(行索引和列索引)。
函数参数详解
func 函数参数说明
int func(int (*p)[4], int m, int n, int *pRow, int *pCol)
int (*p)[4]: 指向包含4个int元素的数组的指针(二维数组参数)int m: 数组的行数int n: 数组的列数int *pRow: 指向存储最大值行索引的指针int *pCol: 指向存储最大值列索引的指针
代码逐步分析
1. 初始化部分
max = **p; // 将数组第一个元素作为初始最大值
*pRow = 0; // 初始化行索引为0
*pCol = 0; // 初始化列索引为0
解释:
**p等价于*(*(p+0)+0),即数组的第一个元素aa[0][0]- 假设第一个元素是最大值,后续通过比较来更新
2. 双重循环遍历
for (i=0; i<m; i++)
{
for (j=0; j<n; j++)
{
if ( *(*(p+i)+j) > max)
{
max = *(*(p+i) + j);
*pRow = i;
*pCol = j;
}
}
}
解释:
- 外层循环控制行(i从0到m-1)
- 内层循环控制列(j从0到n-1)
*(*(p+i)+j)等价于p[i][j],访问数组元素- 当找到更大的值时,更新最大值和对应的行列索引
3. 指针表达式详解
*(*(p+i)+j) 的含义:
p是指向数组行的指针p+i指向第i行*(p+i)解引用得到第i行的首地址*(p+i)+j指向第i行第j列的元素*(*(p+i)+j)解引用得到该元素的值
等价表示法:
*(*(p+i)+j)≡p[i][j]≡(*(p+i))[j]
主函数分析
int aa[3][4] = {{1,3,5,7},{21,19,27,22},{11,17,18,20}};
数组内容可视化:
行\列 0 1 2 3
0 1 3 5 7
1 21 19 27 22
2 11 17 18 20
程序执行过程
初始状态:
max = 1(aa[0][0])row = 0, col = 0
遍历过程中的关键更新:
- i=1, j=0: 发现21 > 1,更新
max=21, row=1, col=0 - i=1, j=2: 发现27 > 21,更新
max=27, row=1, col=2 - 继续遍历,27仍然是最大值
最终结果:
- 最大值:27
- 位置:第1行第2列(从0开始索引)
- 输出:
27 1 2
关键技术点
1. 二维数组参数传递
int (*p)[4] // 指向包含4个int的数组的指针
这种声明方式明确指定了每行的元素个数,便于编译器进行地址计算。
2. 指针算术
p+i移动到第i行*(p+i)得到第i行的首地址*(p+i)+j移动到第i行第j列*(*(p+i)+j)获取元素值
3. 通过指针返回多个值
函数通过指针参数 pRow 和 pCol 返回位置信息,同时通过返回值返回最大值。
时间复杂度
- 时间复杂度:O(m×n),需要遍历所有元素
- 空间复杂度:O(1),只使用常数额外空间
注意事项
- 数组索引从0开始
- 如果有多个相同的最大值,返回第一个找到的位置
- 指针表达式
*(*(p+i)+j)虽然看起来复杂,但本质上就是访问二维数组元素

浙公网安备 33010602011771号