2014-02-12 5 views
0

Привет У меня есть простой код, как этотC++ указатели значение изменения

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 

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

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

ответ

2

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

Линия:

x = *z + b; 

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

b_in_main = b_in_main + b_in_func; 

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

+0

Спасибо :) Теперь я получил это :) – Bankin

0

Потому что вы изменили его, чтобы указать на локальной переменной а

z = &a; 

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

+0

Я спросил про другую вещь. Спасибо за ответ, но это был не мой вопрос :) – Bankin

+0

разве вы не спросили, почему значение * z изменилось после этой строки x = * z + b; ? – marcadian

+0

Да, но ваш ответ на что-то двух строк ниже, которое не выполняется во время 'x = * z + b'. Я имею в виду два couts, в первом '* z == 4' после' x = * z + b'' * z == 5'. Приведенные выше ответы верны – Bankin

1

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

Так что:

  1. Вы можете изменить х, который связан с б

  2. Z изменения, соответствующие новым значением B, потому что это связано с ним.

1
x = *z + b; 

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

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

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 

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

Смежные вопросы