OriginalGriff
Когда вы передаете значение в C, оно передается по значению каждый раз.
Это означает, что значение" внешний мир " копируется, и эта копия отправляется в функцию. Любые изменения, вносимые функцией в значение, вносятся в копию значения и не отражаются во "внешнем мире" после завершения функции.
Вот почему эта версия:
junk ( i, j ) ;
printf ( "\n%d %d", i, j ) ;
...
junk ( int i, int j )
{
i = i * i ;
j = j * j ;
}
Выводит значения так, как если бы функция не была вызвана.
Когда вы передаете адрес значения функции, это адрес, который копируется и передается в качестве параметра, а не элемент, для которого он является адресом. Подумайте об этом как о машинах: вы всегда паркуете свою машину на одном и том же парковочном месте, поэтому вы можете сказать кому-то, где находится ваша машина, сказав "ряд 17, слот 12", и они могут найти вашу машину. Но "адрес машины" работает независимо от того, какая машина там находится: когда вы говорите своему другу, где находится ваша машина, и даете ему ключи, вы не делаете копию своей машины!
Итак, когда вы попробуете эту функцию:
junk ( &i, j ) ;
printf ( "\n%d %d", i, j ) ;
...
junk ( int *i, int j )
{
*i = *i * *i ;
j = j * j ;
}
Значения, которые получает функция, являются копией адреса i и копией значения j.
i
адреса влияют на переменную во внешнем мире, изменяют значение
j
не надо, потому что это копия ценности.
Возвращаясь к машинам, ты отдал своему приятелю ключи и адрес, где припарковал машину. Если он разбивает машину во время вождения, ущерб наносится вашей машине, а не ее копии, потому что вы передали копию адреса машины, а не копию самой машины.
Теперь в этом есть смысл?