在下面的代码中,我试图实现一个函数,该函数查找给定数组的最大值和最小值。但是我试图使用另一种方法。我试图将指针的内存地址更改为最大值和最小值。
为什么这不起作用?我应该使用指向指针的指针来解决此问题吗?
#include <stdio.h>
#define M 5
void maxMin(int *v, int N, int *max, int *min){
int i;
printf("%d\n",*v);
printf("%d\n",*max);
for(i = 0; i < M; i++){
if(*max < *(v+i)){
max = (v+i);
}
if(*min > *(v+i)){
min = (v+i);
}
}
}
int main(){
int v[M] = {1, 3, 5, 7, 8}, *max=v, *min=v;
maxMin(v, M, max, min);
printf("MAX %d\n", *max);
printf("MIN %d\n", *min);
return 0;
}
答案 0 :(得分:3)
您应该使用双指针,因为像这样传递双指针将复制指针的值。
void maxMin(int *v, int N, int **max, int **min){
int i;
int minVal = *v;
int maxVal = *v;
for(i = 0; i < M; i++){
if(maxVal < *(v+i)){
maxVal = *(v+i);
*max = (v+i);
}
if(minVal > *(v+i)){
minVal = *(v+i);
*min = (v+i);
}
}
}
然后您像这样调用该函数。
maxMin(v, M, &max, &min);
其余部分保持不变。
答案 1 :(得分:1)
在这里需要使用指针的唯一原因是,您希望同时返回min和max,但是一个函数只有一个返回值。因此,您必须通过参数返回它们。
#include <stdio.h>
#define M 5
void maxMin(size_t n, const int v[n], int *max, int *min)
{
*max = v[0];
*min = v[0];
for(size_t i = 1; i < n; i++)
{
if(*max < v[i])
{
*max = v[i];
}
if(*min > v[i]){
*min = v[i];
}
}
}
int main (void)
{
int v[M] = {1, 3, 5, 7, 8};
int max;
int min;
maxMin(M, v, &max, &min);
printf("MAX %d\n", max);
printf("MIN %d\n", min);
return 0;
}
(返回指向max和min元素的两个指针将是一个怪异的接口-在这种情况下,您宁愿返回可以找到max和min的索引。)
答案 2 :(得分:0)
您正在使用max
将存储在指针min
和maxMin()
中的值(即数组的起始地址)传递给函数maxMin(v, M, max, min)
。这意味着min
中的指针变量max
和main()
与min
参数列表中的max
和maxMin()
指针变量有关。因此,maxMin()
中对这些变量所做的任何更改都不会反映在main()
中。
您需要做的是传递min
和max
变量的地址,并在函数*min
中更新*max
和maxMin
的值(请参见Petar Velev的答案)。