初始化错误

时间:2013-11-26 09:43:15

标签: c++

正如指示所说,我无法弄清楚如何修复错误而不改变主程序中的任何内容。编译器在第20行给出了一个错误,即主程序中调用findMax函数的行,因为ptr正在被使用而没有被初始化。

我不明白为什么编译器说ptr没有被初始化,因为在findMax函数中,pToMax被设置为等于arr。

我尝试通过将其初始化更改为int ** pToMax并将*添加到findMax函数中的pToMax的所有后续实例来使pToMax成为指向ptr的指针。但是,在我这样做之后,编译器说它不能在第20行从int *转换为int **。

我能想到的唯一其他修复方法是在主例程中初始化int * ptr到nullptr,但是说明说我不允许修改主例程。

void findMax(int arr[], int n, int* pToMax)
{
    if (n <= 0) 
        return;      // no items, no maximum!

    pToMax = arr;

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

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

    findMax(nums, 4, ptr);
    cout << "The maximum is at address " << ptr << endl;
    cout << "It's at position " << ptr - nums << endl;
    cout << "Its value is " << *ptr << endl;
}

2 个答案:

答案 0 :(得分:5)

findMax()只是修改局部变量。您需要以某种方式将该值传播回调用函数 - 最简单的方法是将其作为引用传递:

void findMax(int arr[], int n, int*& pToMax)
{
    // ...
} 

答案 1 :(得分:1)

如果你想通过引用传递指针本身,

findMax()应该会收到指向int的指针,而不是指向int的指针。请记住,C中的每个值都是通过副本传递的,这意味着您将ptr的副本传递给findMax()。在findMax()内,您可以将其指向其他位置,但这些更改在main()中不可见。因此,在ptr中使用main()会在打印其地址时导致未定义的行为。

使用指向指针的指针添加另一个间接级别,如下所示:

void findMax(int arr[], int n, int **pToMax)
{
    if (n <= 0) 
        return;      // no items, no maximum!

    *pToMax = arr;

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

编译器抱怨由于int *类型为int **而无法将ptr转换为int *。您需要使用引用运算符&来获取指向ptr的指针并将其传递给findMax()

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

    findMax(nums, 4, &ptr);
    cout << "The maximum is at address " << ptr << endl;
    cout << "It's at position " << ptr - nums << endl;
    cout << "Its value is " << *ptr << endl;
}

那应该解决它。