void f(int *b) {
b = new int;
*b = 2;
}
int main() {
int *a = NULL;
f(a);
if (a == NULL) {
std::cout << "mde";
}
return 0;
}
Объясните, пожалуйста, почему в данном коде переменная a
попрежнему осталась NULL
? Ведь указатель - это адресс на область памяти. Изначально он никуда не указывает. Потом я передаю адресс на эту облась памяти и туда уже что-то записываю и она не изменяется. Объясните, пожалуйста, почему?
При передаче параметра в функцию по значению создается копия.
void f(int *b) { // в b копируется переданное значение
b = new int; // в b заносится новый адрес
*b = 2;
} // при выходе b уничтожается
Так что то, что вы поработали с копией a
, на значение a
никак не влияет.
Вам нужно (раз это C++) использовать ссылку на указатель:
void f(int* &b) {
b = new int;
*b = 2;
}
Тогда результат работы сохранися в a
.
Или передавать указатель на указатель:
void f(int**b) {
*b = new int;
**b = 2;
}
int *a = NULL;
f(&a);
Потому что вы передаете указатель a по значению, а не по ссылке. То есть, внутри функции f b - это копия указателя a. И то, что вы туда записываете новый адрес a никак не затрагивает.
Если вам нужно именно модифицировать a, сделайте так (вариант со ссылкой):
void f(int*&b)
{
b = new int;
*b = 2;
}
или так (вариант с указателем):
void f(int **b)
{
*b = new int;
**b = 2;
}
Во втором случае, вызов f надо поменять: не f(a); а f(&a);
Виртуальный выделенный сервер (VDS) становится отличным выбором
Суть : Допустим у нас есть функция, в результате выполнения действий внутри нее мы получаем значения переменных, которые нам необходимо вернутьКак...
Macbook C++ C# Ggdghcdyvxghdfjvdfhcdgvxghcdhbcg
При компиляции открывается консоль, которая выводит два отрицательных восьмизначных числаЧто не так?