【问题标题】:Finding pointer to maximum value of array查找指向数组最大值的指针
【发布时间】:2017-11-23 23:39:36
【问题描述】:

我写了一个函数,应该“返回”指向数组最大值的指针

void findMax(int arr[], int n, int* pToMax)
{
    if (n <= 0)
        return;   

    pToMax = arr;

    for (int i = 1; i < n; i++)
    {
        if (arr[i] > *pToMax) {
            pToMax = arr + i;
        }
    } 
}

我主要用

来称呼它
int nums[4] = { 5, 3, 15, 6 };
int* ptr = nums;
findMax(nums, 4, ptr);

但是,指针值似乎没有从函数中改变,这让我相信第三个参数可能必须是指向指针的指针。但我认为无论函数中的指针做什么都会改变指针(就像引用一样)

编辑:重做函数

void findMax(int arr[], int n, int** pToMax)
{
    if (n <= 0)
    return;

    pToMax = &arr;

    for (int i = 1; i < n; i++)
    {
        if (arr[i] > *(*pToMax)) {
            *pToMax = arr + i;
        }
    }
}

现在我这样称呼它

int nums[4] = { 5, 3, 15, 6 };
int* ptr = nums;
findMax(nums, 4, &ptr);

【问题讨论】:

  • 当您将其更改为指向指针的指针或指针引用时,您观察到了什么?
  • 基本内容:对pToMax 所做的任何更改都不会在函数外部可见。对*pToMax 的任何更改都将是。
  • @Tas 好像没有效果
  • 您通过值而不是通过引用传递指针,因此 pToMax 是 ptr 的副本,仅存在于您的函数中。将参数更改为 int* &pToMax ,它应该可以工作。如果这个问题仍然存在,我稍后会详细说明。
  • int* ptr = std::max_element(nums, nums + 4); -- 不需要函数。

标签: c++ arrays pointers max


【解决方案1】:

您不需要if (n &lt;= 0) 它由循环条件处理

你不需要pToMax = arr;,你是在调用函数之前做的

要通过引用传递指针以便修改它,请使用int *&amp;pToMax

 void findMax(int arr[], int n, int *&pToMax)
 {
    for (int i = 1; i < n; i++)
    {
        if (arr[i] > *pToMax)
            pToMax = &arr[i];
    }
 }

称呼它:

int nums[4] = { 5, 3, 15, 6 };
int* ptr = nums;
findMax(nums, 4, ptr);
std::cout << *ptr; //15

【讨论】:

    【解决方案2】:

    Killzone Kid 使用通过引用传递的指针发布了一个可行的解决方案。您的第二次尝试实际上也在正确的轨道上。当您重新分配pToMax 时,您只是犯了一个小错误,因此它不再指向ptr,而是指向arr。相反,您应该取消引用pToMax 以将ptr 指向arr。这是一个经过测试且有效的解决方案:

    #include <iostream>
    
    void findMax(int arr[], int n, int** pToMax)
    {
        if (n <= 0)
        return;
    
        *pToMax = arr;
    
        for (int i = 1; i < n; i++)
        {
            if (arr[i] > *(*pToMax)) {
                *pToMax = arr + i;
            }
        }
    }
    
    int main( void )
    {
        int nums[4] = { 5, 3, 15, 6 };
        int* ptr = NULL;
        findMax(nums, 4, &ptr);
    
        std::cout << *ptr << std::endl;
    }
    

    【讨论】:

      【解决方案3】:

      一个更好的方法是只做*max_element(nums, nums + 4),因为你只是使用一个整数数组。

      假设你有数组int num[5]={1, 5, 6, 2, -1}; 您可以使用内置 C++ 函数 max_element 使用单行命令代替您的函数。 要找到最大元素,您只需说 int theMax = *max_element(num, num + 5); 即可。

      这是一个示例程序:

      #include <iostream>
      #include <algorithm>
      
      using namespace std;
      
      int main()
      {
          int num[5] = {1, 5, 6, 2, -1};
          int theMax = *max_element(num, num + 5);
          cout << theMax << endl;
      }
      

      【讨论】:

      • 我有点困惑……这应该在哪里?
      • 假设你有数组 int num[5]={1, 5, 6, 2, -1};您可以使用内置 C++ 函数 max_element 使用单行命令代替您的函数。要找到最大元素,您可以说 int theMax = *max_element(num, num + 5);你就完成了。
      • 这能回答你的问题吗?你需要详细说明吗?顺便说一句,请点赞 :)...不过,只有在它适合你的情况下。
      • std::beginstd::end 在这里也很有帮助。只要您有一个数组而不是指向数组的指针,它们就不需要在调用 max_element 时使用魔术变量。
      • 整数数组没有 .begin 和 .end 函数。我想你的意思是向量。
      【解决方案4】:

      首先,我在下面为您的问题提出一个解决方案:

      #include <iostream>
      using namespace std;
      
      int * findMax(int arr[], int n, int* pToMax)
      {
          if (n <= 0)
              return pToMax;
      
          for (int i = 1; i < n; i++)
          {
              if (arr[i] > *pToMax) {
                  pToMax = arr + i;
              }
          }
      
          return pToMax;
      }
      
      int main() {
      
        int nums[4] = { 5, 3, 15, 6 };
        int* ptr = nums;
        cout << "Big is " << *findMax(nums, 4, ptr) << "\n";
      
        return 0;
      }
      

      请注意:当你创建一个赋值给数组的指针时,它默认假定初始位置,所以函数内部的赋值pToMax = &amp;arr;是不必要的。

      另外要理解的是,你没有使用二维数组,所以int** pToMax 完全超出了这个问题的范围。

      检查上面的解决方案。希望对你有帮助。

      注意:这个问题根本不需要使用指针。但是,如果您的研究重点是理解指针,那么此解决方案将适合您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-25
        • 1970-01-01
        • 1970-01-01
        • 2021-02-07
        • 2021-12-16
        • 2014-07-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多