Изменить указатель на int, переданный в функцию

c++

42 просмотра

3 ответа

Учитывая следующий код (базовый C ++):

#include <cstdio>

void changeNum(int* n) {
    int x = 6;
    n = &x;
}

int main() {
    int num = 5;
    changeNum(&num);
    printf("num = %d\n", num);
}

Почему numдо сих пор 5? Не должен n = &xсделать это 6?

Удаляется ли xпри выходе из функции?

Автор: galah92 Источник Размещён: 08.11.2019 11:08

Ответы (3)


3 плюса

Решение

X удаляется при выходе из функции?

Да. xявляется локальной переменной . Те переменные, которые объявлены внутри функции или блока, являются локальными переменными. Они могут использоваться только операторами, которые находятся внутри этой функции или блока кода.

Короче говоря, это означает, что когда функция changeNumзаканчивается, переменная x(которая размещается в стеке) будет уничтожена.

Почему Num все еще 5? Не должно ли n = & x сделать это 6?

Давайте проанализируем вашу странную функцию:

void changeNum(int* n) {
    int x = 6;
    n = &x;
}

Здесь вы создаете указатель n и присваиваете ему адрес локальной переменной x .

Различные комментарии неправильны, обратите внимание! Это не неопределенное поведение . Указатель nсоздается (поскольку передается по значению, обратите внимание, что сам указатель передается по значению! ), Когда функция вызывается, и она уничтожается, когда функция завершается.

Практически ваша функция ничего не делает: создайте указатель, который инициализируется адресом, предоставленным вызывающей стороной, и назначьте ему другой адрес.

changeNum(&num);

Просто говорит: «создать временный указатель, передать его по значению в функцию changeNum(примечание передать по значению указатель!)» . Таким образом, он создаст копию указателя и будет использоваться функцией.

Как я могу добиться того, чего хочу?

Я предлагаю вам учиться лучше, потому что ваш код показывает вашу неопытность с указателями.

В любом случае правильное поведение должно быть:

void changeNum(int* n) {
    *n = 6
}

Который сопоставляет 6к целому указываемогоn !

Автор: Biagio Festa Размещён: 20.08.2016 10:15

1 плюс

Нет, это не работает так, как вы ожидаете.

&Оператор принимает адрес переменной. Таким образом, вы назначаете адрес, а не значение. В результате вы переопределяете указатель, который является локальной переменной, которая, как оказалось, имеет семантическое значение ссылки на другой объект.

Есть 2 способа решения этой проблемы:

Способ 1 Разыменование n, так что вы можете назначить его.

*n = x;

Метод 2 Перепишите метод, чтобы принять ссылку, поскольку это делает назначение более интуитивным.

void changeNum(int &n) {
    int x = 6;
    n = x;
}
int main() {
    int n = 5;
    changeNum(n);
}
Автор: JVApen Размещён: 20.08.2016 10:04

0 плюса

Во-первых, переменная 'x' объявлена ​​внутри void ChangeNum(*n), и когда она выходит из области видимости (когда выполнение вышло из функции), x удаляется.

Во-вторых, чтобы присвоить значению x значение num, измените void ChangeNumего следующим образом:

void changeNum(int &n)
{
    int x = 6;
    n = x;
}

И вызвать функцию следующим образом:

changeNum(num);

Автор: ClobberXD Размещён: 20.08.2016 10:10
Вопросы из категории :
32x32