ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

指针妙用:快速找出数组极值

2026/8/5 7:57:27 拓冰建站 浏览量
指针妙用:快速找出数组极值

求数组中最大数和最小数--利用指针

这段代码主要功能是动态定义一个整型数组,让用户输入指定数量的整数,然后找出并输出这些数中的最大值和最小值。

#include <stdio.h>
void f1(int *arr, int len)
{
if (len <= 0 || arr == NULL)
{
printf("数组长度不合法或指针为空!\n");
return;
}
printf("请输入%d个整数:\n", len);
for (int *p = arr; p < arr + len; p++) scanf("%d", p);
}
void f2(int *arr,int len,int *max,int *min)
{
if (len <= 0 || arr == NULL)
{
printf("数组长度不合法或指针为空!\n");
return ;
}
*max = *arr;
*min = *arr;
for(int *p = arr + 1;p < (arr + len);p++)
{
if(*p > *max) *max = *p;
if(*p < *min) *min = *p;
}
}
int main()
{
int n;
printf("请输入长度(数字):\n");
scanf("%d",&n);
int nums[n];
int max1,min1;
f1(nums,n);
f2(nums,n,&max1,&min1);

printf("数组:\n");
for(int i = 0;i<n;i++)
printf("%d ",nums[i]);
printf("\n最大值:%d\n最小值:%d\n",max1,min1);

return 0;
}

这段代码是学习 C 语言指针的绝佳案例。它几乎涵盖了指针在数组操作中最核心的几个概念:指针与数组的关系、指针算术、指针作为函数参数以及解引用。
下一篇文章我将结合这段代码,系统地讲解相关的指针知识。

输入函数 f1

  • 参数int *arr是数组首地址,int len是数组长度。
  • 安全检查:首先判断长度是否小于等于 0,或者指针是否为空(NULL)。这是一个很好的编程习惯,防止非法内存访问。
  • 指针遍历
    • int *p = arr:定义一个指针p,初始指向数组开头。
    • p < arr + len:循环条件。arr + len指向数组最后一个元素之后的位置(即越界的前一个位置)。只要p没到这个位置,循环就继续。
    • p++:指针向后移动一个int的位置(通常是 4 字节)。
    • scanf("%d", p):直接将输入的整数存入p指向的内存地址。注意:这里不需要取地址符&,因为p本身就是一个地址。

计算最值函数 f2

  • 参数:除了数组和长度,还传入了int *maxint *min
    • 关键点:这里传入的是地址。函数内部通过解引用操作符*(如*max = *p)直接修改main函数中对应变量的值。这是 C 语言中实现“函数返回多个值”的标准方法。
  • 初始化*max = *arr表示将数组第一个元素的值赋给max指向的变量。同理初始化min
  • 遍历优化for(int *p = arr + 1; ...)
    • 因为第一个元素已经用来初始化了,所以循环直接从第二个元素arr + 1开始,避免了不必要的自我比较。
  • 逻辑:逐个比较,动态更新最大值和最小值。

主函数main

变长数组 (VLA)int nums[n];

  • 这里数组的大小n是由用户在运行时输入的。
  • 特性:这是 C99 标准引入的特性。数组在栈(Stack)上分配。
  • 函数调用
    • f1(nums, n)nums作为数组名,自动退化为指向首元素的指针传入。
    • f2(nums, n, &max1, &min1):注意这里使用了&取地址符,将max1min1的地址传给f2,以便f2能修改它们的值。
  • 输出循环:这里使用了传统的下标法nums[i]进行遍历输出,与前面函数中的指针法形成对比,展示了两种访问数组的方式。