Постараюсь объяснить. Указатели действительно весело и мощный, если у вас хватит терпения:
fn1(x,y,&z);
cout<< x<< " " << y<< " "<< z<< endl;
// output: 8 7 8 (I dont get this part!!!)
Давайте посмотрим на нашу функцию FN1
int fn1(int &a, int b, int *c){
a=b++;
b+=7;
*c= ++a;
return b;
}
Первое, обратите внимание, что в fn1(int &a)
переменной а передается по ссылке, а не по стоимость. Это означает, что мы будем напрямую работать со значением, которое мы передаем a. Это в основном означает, что если вы измените значение a внутри функции, изменение будет persist. Итак, с int x=4, y=7, z=14;
и мы вызываем fn1(x, y, &z)
, мы передаем переменную x в a (подумайте, что она временно переименовывается из x в a). Итак, a
изначально 4. b - просто значение, поэтому содержимое y передается в b и * c является указателем и просто принимает в качестве значения физический адрес z (поэтому у вас есть fn1(&z)
).
Так что, когда мы называем нашу функцию fn1(x, y, &z)
мы выполняем:
a=b++;
Таким образом, изменения в 7, б изменений 8. (если это сбивает с толку, читать интро о операторов this) Тогда:
b+=7; //same as: b=b+7;
Так что b принимает значение 8 + 7 = ?? (! Жаль, что я не имею степень по математике!)
Наконец:
*c= ++a;
Теперь, так как мы имеем ++ а, сначала изменения в = а + 1, и теперь принимает значение из 8, так как это было 7! И * c означает «значение переменной, с которой указывает указатель c»: так что значение переменной c указывает на z
. Таким образом, значение z изменяется на любое значение a (которое равно 8).
И вот последний шаг (для настоящего на этот раз). Почему не y
изменить? Поскольку мы fn1
берет значение b по значению, а не по ссылке, а когда функция заканчивается, var b уничтожается.
Теперь попробуйте сделать вторую часть:
y=fn1(x,y,&z);
В этом случае у будет принимать все fN1 возвращается! Я бы посоветовал вам шаг за шагом. Если это все еще запутывает, выполняйте раздельно с поведением каждого типа var, передавая его по ref, по val и позже указателем.
Речь идет о указателях. Когда вы выводите переменные, он просто ссылается на выделенное место вместо определенной переменной. Проверьте это, и у вас должна быть идея: http://www.cplusplus.com/doc/tutorial/pointers/ – Hozikimaru
Почему бы вам не получить его? Как вы думаете, какими они должны быть? Помните, что [post increment и pre increment возвращают разные значения] (http://stackoverflow.com/questions/17366847/what-is-the-difference-between-pre-increment-and-post-increment-in-cycle -fo) – NathanOliver
@NathanOliver Я не думаю, что это из-за приращения действительно. Я считаю, что ему нужно понимать указатели против обычных переменных. – Hozikimaru