Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

Не изменяется значение указателя

#cpp


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?
Ведь указатель - это адресс на область памяти. Изначально он никуда не указывает. Потом
я передаю адресс на эту облась памяти и туда уже что-то записываю и она не изменяется.
Объясните, пожалуйста, почему?
    


Ответы

Ответ 1



Потому что вы передаете указатель 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);

Ответ 2



При передаче параметра в функцию по значению создается копия. 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);

Комментариев нет:

Отправить комментарий