繁体   English   中英

寻找指向数组最大值的指针

[英]Finding pointer to maximum value of array

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

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

您不需要if (n <= 0)来处理循环条件

您不需要pToMax = arr; ,您在调用函数之前就已经这样做了

要通过引用传递指针以便可以对其进行修改,请使用int *&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

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

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

假设您有数组int num[5]={1, 5, 6, 2, -1} 1,5,6,2 int num[5]={1, 5, 6, 2, -1} ; 除了使用函数外,还可以使用内置的C ++函数max_element使用单行命令。 要找到max元素,您可以说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;
}

首先,我在下面介绍您的问题的解决方案:

#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 = &arr; 函数内部没有必要。

要理解的另一件事是,您没有使用2D数组,因此int** pToMax完全超出了此问题的范围。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM