Различия между передачей по ссылке и передачей по адресу - PullRequest
0 голосов
/ 05 сентября 2018
int func(int a, int& b){
   if (a < 3){
       return b;
   } else{
       b++;
       return func( a/10, b);
   }
}

Я думаю, что здесь b передается по указателю, который аналогичен передаче по ссылке. Что такое передача по адресу, чем она отличается от передачи по ссылке? Есть ли какая-либо переменная в выше передается по адресу? Кроме того, почему func (40, 0) выдал мне ошибку в качестве вывода?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Позвольте мне попробовать, чтобы вы поняли легко. Когда вы объявляете какую-либо переменную в вашей программе на c ++, компилятор создает запись в таблице символов для этой переменной, а затем для нее выделяется соответствующее пространство в памяти. В случае ссылочной переменной в таблице символов появится новая запись, которая имеет такое же хранилище ссылочной переменной, для нее не будет места, выделенной позже, это просто псевдоним, как вы можете ссылаться двумя именами (например, имя, никнейм). Теперь давайте рассмотрим переменную указателя. Независимо от этого это указатель, но это переменная, поэтому он также будет иметь запись в таблице символов и место для нее будет выделено позже.

Таким образом, из приведенных выше утверждений вы можете легко найти разницу ниже между адресом (указателем) и ссылочной переменной. 1) Для ссылочной переменной не будет выделяться дополнительная память, но для переменной-указателя будет 4 или 8 байт, в зависимости от системы (32- или 64-разрядной операционной системы), для которой вы собираетесь скомпилировать и запустить код. 2) вы не можете потом ссылаться на ссылочную переменную как обычно, поэтому вы не можете изменить ссылку, но в случае переменной указателя она может содержать другой указатель.

То же самое применимо для передачи по ссылке и передачи по адресу. Надеюсь, это поможет вам лучше понять.

Попробуйте выполнить приведенный ниже код, и вы обнаружите, что адрес переменной и ссылочной переменной совпадают

int main()
{
  int i = 10;
  int& j = i;

  printf(" address of i = %u address of j = %u", &i, &j);
  return 0;
}
0 голосов
/ 05 сентября 2018

На практике нет большой разницы между передачей по ссылке или передачей по указателю. Некоторые компиляторы, такие как ссылки на модели MSVC, точно такие же.

Однако при взгляде на детали он содержит некоторые удивительные элементы:

  • Ссылки выглядят как обычные переменные, поэтому нет необходимости * или -> везде
  • Ссылки не могут быть nullptr, позволяя немного более производительный код для static_cast (когда вам это удается, это неопределенное поведение)
  • Ссылки не имеют фиксированного объема памяти, на практике это тот же самый указатель, однако на него нельзя полагаться
  • Ссылки не могут быть переназначены, только то, на что они указывают, может быть изменено
  • Ссылки не совместимы с C

В общем, вы можете рассматривать ссылки как особые случаи указателей (или наоборот). Лично я стараюсь использовать ссылки всякий раз, когда это возможно, и прибегаю к указателям только тогда, когда это необходимо.

...