Указатели в c ++ передаются по значению / ссылке - PullRequest
2 голосов
/ 17 января 2012

как простые переменные, переменные-указатели может быть также использована в качестве параметра значения или ссылки параметра в функции ..... но как переменные-указатели используются ячейки памяти 2 удержания или содержимое ячейки памяти, то что больше разницы будет егосделать, если переменная указателя используется в качестве значения или в качестве параметра ссылки ????

Ответы [ 4 ]

9 голосов
/ 17 января 2012

Если функция A передает указатель P посредством ссылки на другую функцию B, то B может заставить P указывать на другое место в памяти, и A увидит это изменение.Если, с другой стороны, A передает P по значению, то B может изменять только содержимое памяти, на которое указывает P.A увидит изменения в этой памяти, но P никогда не будет указывать на другое место в памяти, когда вернется B.

5 голосов
/ 17 января 2012

Разница в следующем:

  1. если вы передадите указатель значением , любые изменения в указателе, сделанные вызываемым , не будут видимый для вызывающего абонента;
  2. если передать указатель по ссылке , любые изменения в указателе, сделанные вызываемым , будут видимыми для вызывающего абонента.

Здесь я говорю о значении самого указателя (т.е. где он указывает), а не о значении объекта, на который указывает указатель.

4 голосов
/ 17 января 2012

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

//pass by value
void InitString1( char* buf )
{
    buf = new char[5];
}

//pass by reference
void InitString2( char*& buf )
{
    buf = new char[5];
}

int main()
{
    char* buffer = 0;
    InitString1( buffer);
    //buffer is still null and memory leaks
    delete [] buffer;

    InitString2( buffer );
    //buffer will be assigned correctly
    delete [] buffer;

    return 0;
}
0 голосов
/ 17 января 2012
#include <iostream>
void passByValue(int* p) {
  p = new int;
}
void passByReference(int*& p) {
  p = new int;
}
int main() {
  int *p1 = 0;
  int *p2 = 0;
  passByValue(p1);
  passByReference(p2);
  std::cout << p1 << "\n";
  std::cout << p2 << "\n";
}

Рассмотрим вышеуказанную программу. Первая строка всегда будет печатать ноль, означая, что переменная main p1 была , а не , обновленная при вызове passByValue. Напротив, p2 был обновлен вызовом на passByRefernce.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...