2013-11-26 165 views
0

如指令所述,我无法确定如何修正错误,而不更改主例程中的任何内容。编译器给我一个错误,第20行是主程序中调用findMax函数的那一行,因为ptr正在被使用而没有被初始化。初始化错误

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

我试图通过将pToMax的初始化更改为int ** pToMax并将*添加到findMax函数中的所有后续pToMax实例,来使pToMax成为指向ptr的指针。但是,在我这样做后,编译器说它不能在int 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; 
} 
+3

您正在传递'pToMax'。将其作为函数返回值返回或通过地址('int ** ppToMax')传递并在其中进行适当编码。 – WhozCraig

+0

@WhozCraig,当然这是一个答案? :) –

+1

@ Moo-Juice到现在为止,我正盯着C和C++标签,并不确定OP想要什么。值得庆幸的是,无论如何,六个人都会回答基地问题,巩固[研究提出]的强有力指标(http://meta.stackexchange.com/questions/182266/how-much-research在发布这个之前,应该尽可能使用堆栈溢出用户/ 182380#182380)。 – WhozCraig

回答

5

findMax()只是修改本地变量。你需要的是价值某种方式传播回调用函数 - 最简单的方法是把它作为,而不是一个参考:

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

(还有11个要去) –

+0

@ user2752992如果指令如你所说(一个不可修改的'main()')这是*唯一*的方法来做到这一点。 – WhozCraig

+0

谢谢,它的工作。 我仍然困惑为什么,虽然。 当我用ptr调用findMax时,int *&pToMax被设置为ptr。 int *&pToMax基本上是指向pToMax的指针指向的东西,即pToMax?但是pToMax的类型是什么?它必须是一个指针,如果它可以设置为ptr,但为什么它会有一个&? 对不起,我不知道技术术语,但我很困惑 – gallardoelise

1

findMax()应该得到一个指针指向int的指针,指针,而不是为int,如果你想通过引用传递指针本身。请记住,C中的每个值都通过复制传递,这意味着您要将ptr的副本传递给findMax()。在findMax()内部,您可以将它指向其他地方,但这些更改将不会在main()中可见。因此,使用ptrmain()会导致您在打印其地址时出现未定义的行为。

使用指针,指针增加一个间接的另一个层面,是这样的:

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 **当你这样做,因为ptrint *类型。你需要使用引用运营商&获得一个指向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; 
} 

这应该修复它。

+0

当然是正确的,但OP已经表示他不能改变'main'功能。 –

+0

是的,这个问题被标记为C,如果你使用C,我认为你不能在不更改'main'的情况下修复它。使用C++,你的答案肯定是他想要的。 –