求助~
#include <stdio.h>int max,min;
void max_min_value(int array[],int n);
void main()
{
int i,number;
printf("enter 10 integer numbers:\n");
for(i=0;i<10;i++)
{
scanf("%d",&number);
}
max_min_value(number,10);
printf("\nmax=%d,min=%d\n",max,min);
}
void max_min_value(int array[],int n)
{
int *p,*array_end;
array_end=array+n;
max=min=*array;
for(p=array+1;p<array_end;p++)
{
if(*p>max)
{
max=*p;
}
else if(min>*p)
{
min=*p;
}
}
}
如上程序为求最大值和最小值,想问一下如果这里把数组array[]这个形参换成用指针作为形参该如何写? 你的程序有几个问题需要修正:首先,主函数中应该使用数组存储输入的10个整数;其次,函数形参应改为指针类型。下面是修改后的示例代码:
#include <stdio.h>
int max, min;// 全局变量,用于存储最大值和最小值
void max_min_value(int *array, int n);// 函数声明,使用指针作为形参
int main()
{
int arr;// 定义数组存储10个整数
printf("enter 10 integer numbers:\n");
for(int i = 0; i < 10; i++)
{
scanf("%d", &arr);// 输入每个数组元素
}
max_min_value(arr, 10);// 调用函数,传递数组名(即指针)
printf("\nmax=%d,min=%d\n", max, min);
return 0;
}
void max_min_value(int *array, int n)// 函数定义,形参为指针
{
int *p, *array_end;
array_end = array + n;// 计算数组结束位置
max = min = *array; // 初始化最大最小值为第一个元素
for(p = array + 1; p < array_end; p++)// 遍历数组
{
if(*p > max)
max = *p;
else if(*p < min)
min = *p;
}
}
主要修改点:
1. 将函数形参从 int array 改为 int *array,即指针类型。
2. 主函数中使用数组 arr 存储输入,并传递数组名 arr 给函数。
3. 函数内部通过指针运算遍历数组元素,找出最大值和最小值。
这样修改后,程序就能正确运行了。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-2-3 21:39
你的程序有几个问题需要修正:首先,主函数中应该使用数组存储输入的10个整数;其次,函数形参应改为指针类 ...
我还以为形参应该为 *array[],就想不出来了,原来形参改为*array,那我可以理解了,谢谢~~ 但求过程001 发表于 2026-02-03 22:09
FishC 发表于 2026-2-3 21:39
你的程序有几个问题需 ...
不客气,很高兴能帮到你!你的理解是对的,核心就是把形参的类型从 int array 改为 int *array。
这里最关键的一点是:当数组名作为实参传递给函数时,它实际上传递的是数组首元素的地址,所以函数用指针变量来接收是再自然不过的事情了。
你原来的代码框架其实已经非常接近这个思想了(比如函数内部用了 *p 和 p < array_end 这样的指针操作),只是函数声明和主函数里的调用需要配合调整一下。
理解了这个,以后类似“用指针处理数组”的问题就都能举一反三了。如果还有其他疑问,随时可以再来问!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 函数声明 / 定义的形参修改:
原代码:void max_min_value(int array[],int n)
修改后:void max_min_value(int *array, int n)
本质:这两种写法完全等价,编译器都会把 int array[] 解析为 int *array,因为数组作为函数参数时,只会传递数组首元素的地址,不会传递整个数组。
指针操作的核心逻辑:
*array:等价于 array,表示取指针 array 指向的第一个元素值。
array + n:指针算术运算,指向数组首元素往后偏移 n 个位置的地址(超出数组最后一个元素,作为遍历终止条件)。
*p:遍历过程中,取指针 p 当前指向的元素值,等价于 array(比如 p = array + 2 时,*p 就是 array)。
其他小优化:
main 函数返回值改为 int(符合 C 语言标准,原 void main 是非标准写法)。
把 min > *p 调整为 *p < min,逻辑等价,但更符合日常阅读习惯。 #include <stdio.h>
int max,min;
void max_min_value(int *array,int n);
void main()
{
int i,number;
printf("enter 10 integer numbers:\n");
for(i=0;i<10;i++)
{
scanf("%d",&number);
}
max_min_value(number,10);
printf("\nmax=%d,min=%d\n",max,min);
}
void max_min_value(int *array,int n)
{
int *p,*array_end;
array_end=array+n;
max=min=*array;
for(p=array+1;p<array_end;p++)
{
if(*p>max)
{
max=*p;
}
else if(min>*p)
{
min=*p;
}
}
}
代码就这样
页:
[1]