CExercise_06_1指针和数组_1查找数组的最大值和最小值
题目:
查找数组的最大值和最小值,但要将最大值作为返回值返回,最小值则依靠传入的指针完成赋值。
要求不能使用"[]"运算符。
函数的声明如下:
int max_min(int *arr, int len, int *pmin);
关键点
1) * 运算符用于解引用指针,获取指针指向的值
2) 指针算术运算(如 p++)会自动按指向类型的大小移动指针
3) 通过指针可以遍历和修改数组元素而不使用 [] 运算符
分析:
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
/*
查找数组的最大值和最小值,但要将最大值作为返回值返回,最小值则依靠传入的指针完成赋值。
要求不能使用"[]"运算符。
函数的声明如下:
int max_min(int *arr, int len, int *pmin);
*/
int max_min(int *arr, int len, int *pmin) {
int max = *arr; // 假设第一个元素是最大的
*pmin = *arr; // 同样假设第一个元素是最小的
int *p = arr + 1; // 指向数组的第二个元素
while (p < arr + len) {
if (*p > max) {
max = *p;
}
if (*p < *pmin) {
*pmin = *p;
}
p++; // 移动到下一个元素
}
return max;
}
int main(void) {
int numbers[] = { 3, 1, 4, 1, 5, 9, 2, 6 }; // 测试数组
int min; // 用于存储最小值
int size = sizeof(numbers) / sizeof(numbers[0]); // 计算数组长度
// 调用max_min函数,传入数组、长度和 min 的地址
int max = max_min(numbers, size, &min);
// 输出结果
printf("数组中的最大值是: %d\n", max); //打印返回的最大值
printf("数组中的最小值是: %d\n", min); //通过指针获得的最小值
return 0;
}
解决方案总结:
:循环从第二个元素开始, 看p指向的元素是极值,那就取p,循环一次,和max min 都比较了,如果不是极值在max min中间,那原本的max和min是不变的,继续下一个比较.