Изменение значения указателей в C ++

0

Привет, у меня есть простой код, как этот

void func(int &x, int y, int* z){
    int a = 3;
    int b = 1;

    cout << *z << endl;
    x = *z + b;
    cout << *z << endl;
    y = *z + x;
    z = &a;

    cout << "func: x = " << x << endl;
    cout << "func: y = " << y << endl;
    cout << "func: *z = " << *z << endl;
    cout << "func: a = " << a << endl;
    cout << "func: b = " << b << endl;

    return;
}

int main(){
    int a = 2;
    int b = 4;

    func(b, a, &b);
    cout << "main: a = " << a << endl;
    cout << "main: b = " << b << endl;

    return 0;
}

И для вывода я получаю

4
5
func: x = 5
func: y = 10
func: *z = 3
func: a = 3
func: b = 1
main: a = 2
main: b = 5

Поэтому мой вопрос: по какой причине значение * z изменяется после x = *z + b потому что я не могу понять это сам.

заранее спасибо

Теги:
pointers

4 ответа

2
Лучший ответ

x является ссылкой на b в основном (не путать с b в func, который является отдельным). z - указатель на b в основном. Ссылки - это в основном указатели, но без синтаксиса * или &, и вы не можете заставить их указывать на что-то другое (там нет эквивалента z = &a для ссылок).

Линия:

x = *z + b;

в основном делает:

b_in_main = b_in_main + b_in_func;

потому что оба x и *z относятся к одной и той же переменной.

  • 0
    Спасибо :) Теперь я получил это :)
1
x = *z + b;

изменяет значение z, потому что:
- здесь x - это int-ссылка, указывающая на вашу переменную стороны звонящего b
- z - указатель на int, содержащий адрес той же переменной b
Поэтому в этот момент x и z относятся к одной и той же вещи.
Поэтому присвоение нового значения x означает присвоение этого значения b. Поскольку z указывает на b, после этого считывание z дает вам значение, присвоенное x.

Вы можете убедиться в этом, например, написав и сравнив адрес x и значение z:

cout << "(1) z is: " << z << " - &x is: " &x
// should be the same
z = &a;
cout << "(2) z is: " << z << " - &x is: " &x
// should be the different

В вашем контексте оба значения будут идентичны до тех пор, пока вы не переназначите z.

1

Когда вы используете & перед аргументом, который вы передаете методу, он не копируется, а привязывается к нему.

Так что:

  1. Вы меняете x, связанный с b

  2. z изменяется, соответствующее b новому значению, потому что оно связано с ним.

0

Поскольку вы изменили его, указав на локальную переменную a

z = &a;

Следовательно, когда вы разыгрываете его, он дает вам значение локальной переменной a, которая равна 3

  • 0
    Я спросил о другом. Спасибо за ответ, но это был не мой вопрос :)
  • 0
    Вы не спросили, почему значение * z изменилось после этой строки x = * z + b; ?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню