Я пытаюсь понять указатели в С++, поэтому я сделал функцию, которая принимает массив и длину этого массива и распечатывает минимальное и максимальное значения этого массива, однако всегда просто печатает последний элемент в этом массиве для обоих min и max, я просмотрел свой код построчно, но до сих пор не понимаю причину такого поведения, не могли бы вы помочь понять и исправить мой код, спасибо.
void getMinAndMax(int numbers[], int length)
{
int *min = &numbers[0];
int *max = &numbers[0];
cout << length << endl;
for (int i = 1; i < length; i++)
{
if (*min > numbers[i])
{
*min = numbers[i];
}
if (*max < numbers[i])
{
*max = numbers[i];
}
}
cout << "min: " << *min << endl;
cout << "max: " << *max << endl;
}
Используйте отдельные локальные переменные для минимального и максимального значений.
И min
, и max
указывают на одну и ту же память numbers[0]
, поэтому и *min = numbers[i];
, и *max = numbers[i];
записывают данные в та же память, поэтому имеет смысл указывать на одно и то же значение.
Я не вижу в этом большого упражнения для понимания «почему» указателей. Я предполагаю, что это может работать для «как», но вам не нужны указатели, когда вы передаете массив, вы просто мутите воду.
@sweenish Можно начать с «как».
Спросите себя, что означает *min = numbers[i]
. Если вы все еще не понимаете, попробуйте напечатать все значения указателя.
@PasserBy Я никогда не говорил, что это не так, но я тоже не очень ясно выразился. При работе над вопросом «как» я думаю, что лучше найти проблему, которая на самом деле использует преимущества новой вещи, которую вы пытаетесь изучить, вместо того, чтобы впихивать свой принцип в неправильные типы задач. «Как» и «почему» никогда не могут быть полностью отделены друг от друга, так что давайте перестанем пытаться.
@πάνταῥεῖ благодаря вашему совету я сделал следующие модификации, и теперь функция работает, но я все еще не понимаю, что именно произошло :) int x = numbers[0]; интервал у = числа [0]; интервал *мин = &x; интервал *макс. = &y;
Поскольку вы используете оператор разыменования в условии if. Вы в основном меняете значение в ячейке памяти, на которую указывает указатель (в данном случае 0-й индекс массива). Что вы должны сделать в условии if, так это сохранить индекс, в котором присутствуют минимальное и максимальное значения. Вот так
if (*min > numbers[i])
{
min = &numbers[i];
}
Таким образом, указатель будет содержать адреса максимального и минимального значений, и когда вы их разыменуете, вы получите правильный ответ.
Большое спасибо, очень помогло ^_^
Вы пробовали отлаживать код?
*min = numbers[i];
это не переназначает указатель.