如何用C中的指针解决这个问题?

如何用C中的指针解决这个问题?,c,algorithm,pointers,C,Algorithm,Pointers,在下面的代码中,我试图实现一个查找给定数组的最大值和最小值的函数。但我试着用一种不同的方法。我试图将指针的内存地址更改为最大值和最小值 为什么这不起作用?我应该使用指针对指针来解决这个问题吗 #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

在下面的代码中,我试图实现一个查找给定数组的最大值和最小值的函数。但我试着用一种不同的方法。我试图将指针的内存地址更改为最大值和最小值

为什么这不起作用?我应该使用指针对指针来解决这个问题吗

#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;
}
#包括
#定义M 5
void maxMin(int*v,int N,int*max,int*min){
int i;
printf(“%d\n”,*v);
printf(“%d\n”,*max);
对于(i=0;i*(v+i)){
min=(v+i);
}
}
}
int main(){
int v[M]={1,3,5,7,8},*max=v,*min=v;
最大最小值(v,M,max,min);
printf(“最大%d\n”,*MAX);
printf(“最小%d\n”,*MIN);
返回0;
}

您应该使用双指针,因为这样传递它会复制指针的值

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);
        }
    }
}

其余的保持不变。

您应该使用双指针,因为这样传递它将复制指针的值

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);
        }
    }
}

其余部分保持不变。

此处需要使用指针的唯一原因是希望同时返回最小值和最大值,但函数只有一个返回值。因此,必须通过参数返回它们

#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;
}
#包括
#定义M 5
void maxMin(大小n,常数int v[n],int*max,int*min)
{
*max=v[0];
*min=v[0];
对于(大小i=1;iv[i]){
*min=v[i];
}
}
}
内部主(空)
{
int v[M]={1,3,5,7,8};
int max;
int-min;
最大最小值(M、v、max和min);
printf(“最大%d\n”,最大值);
printf(“最小%d\n”,最小值);
返回0;
}

(返回指向max和min元素的两个指针将是一个奇怪的接口-在这种情况下,您更愿意返回可以找到max和min的索引。)

在这里需要使用指针的唯一原因是,您希望同时返回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;
}
#包括
#定义M 5
void maxMin(大小n,常数int v[n],int*max,int*min)
{
*max=v[0];
*min=v[0];
对于(大小i=1;iv[i]){
*min=v[i];
}
}
}
内部主(空)
{
int v[M]={1,3,5,7,8};
int max;
int-min;
最大最小值(M、v、max和min);
printf(“最大%d\n”,最大值);
printf(“最小%d\n”,最小值);
返回0;
}
(返回指向max和min元素的两个指针将是一个奇怪的接口-在这种情况下,您更愿意返回可以找到max和min的索引。)

您正在将存储在指针
max
min
中的值(即数组的起始地址)传递给函数
maxMin()
最大最小值(v,M,max,min)
。这意味着
main()
中的指针变量
min
max
maxMin()
参数列表中的
min
max
指针变量相关。因此,在
maxMin()
中对这些变量所做的任何更改都不会反映在
main()

您需要做的是传递
min
max
变量的地址,并在函数
maxMin
中更新
*min
*max
的值(请参见Petar Velev答案)。

您正在传递值(即数组的起始地址)存储在指向函数
maxMin()
的指针
max
min
中,使用
maxMin(v,M,max,min)
。这意味着
main()
中的指针变量
min
max
maxMin()
参数列表中的
min
max
指针变量相关。因此,在
maxMin()
中对这些变量所做的任何更改都不会反映在
main()


您需要做的是传递
min
max
变量的地址,并在函数
maxMin
中更新
*min
*max
的值(请参见Petar Velev答案)。

max
指向数组。当您传递
max
时,您传递了一个指针。函数接收该指针的副本。当您在函数中修改它时,调用方将看不到它。要修改指针并让调用者看到它,请传递一个“双指针”,即指针的地址。这与您的问题无关,但代码中的参数N和全局宏M之间存在一些混淆。在您的示例中,它不会引起任何问题,因为它们是相同的,但是maxMin应该在其主体中引用“N”而不是“M”。请记住,C按值传递参数,这意味着函数中的参数变量是副本。而修改副本不会修改原件。请研究一下如何在C中模拟按引用传递。可能是数组中重复的
max
点。当您传递
max
时,您传递了一个指针。函数接收该指针的副本。当您在函数中修改它时,调用方将看不到它。要修改指针并让调用者看到它,请传递一个“双指针”,即指针的地址。这与您的问题无关,但代码中的参数N和全局宏M之间存在一些混淆。在您的示例中,它不会引起任何问题,因为它们是相同的,但是maxMin应该在其主体中引用“N”而不是“M”。请记住,C按值传递参数,这意味着函数中的参数变量是副本。而修改副本不会修改原件。请做一些关于在C中模拟通过引用传递的研究。可能是我认为有一个打字错误的副本。参数为
int N
,但for循环指的是
M
@AustinMu