正如指示所说,我无法弄清楚如何修复错误而不改变主程序中的任何内容。编译器在第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;
}
答案 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;
}
那应该解决它。