Имеет ли int * & какой-то реальный смысл? - PullRequest
1 голос
/ 18 февраля 2012

Я смотрю несколько упражнений из университета по C ++, и я обнаружил это упражнение:

#include <iostream>
using namespace std;
int& f(int*&);
int& f(int*& x) {
    *x = 5;
    return *x;
}
int main() { 
    int y = 1, x; 
    int* z = &y; 
    x= f(z);
    cout << y << " " << x <<endl; 
}

Мне было интересно: <any type>*& имеет какой-то реальный смысл? Разве f(int*& x) не совпадает с f(int x)? Вы не передаете указатель на L-значение переменной?

Ответы [ 6 ]

6 голосов
/ 18 февраля 2012

f(int*& x) не совпадает с f(int x).В первом случае x является ссылкой на целочисленный указатель, тогда как во втором случае x является просто целым числом.

Давайте начнем с основ:

Когда вы пишете f(int &x) означает, что x является ссылкой на целое число, и вы можете изменить значение x в функции иизменение будет отражено в вызывающей функции.

Аналогично, когда вы пишете f(int*& x), это означает, что x является ссылкой на целочисленный указатель, и когда вы изменяете адрес, на который указывает x, изменение будеттакже будет отражено в вызывающей функции.

4 голосов
/ 18 февраля 2012

Это ссылка на указатель на int. Затем функция может изменить указатель, если она этого хочет. В вашем примере это не имеет смысла, но, очевидно, имеет смысл.

3 голосов
/ 18 февраля 2012
int& f(int*& x) {
    *x = 5;            // note: changes the pointee, not the pointer
    return *x;
}

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

void f(int*& x) {
    x = new int(42);   // note: changes the pointer
}
3 голосов
/ 18 февраля 2012

С int* &x вы передаете тот же указатель (по ссылке).В противном случае только с int* x вы передаете копию указателя, а затем вы не можете изменить оригинал в функции.&x делает x псевдонимом исходного параметра.

3 голосов
/ 18 февраля 2012

Нет: *& здесь не означает «адрес разыменования».Это означает: «передать указатель byref».

0 голосов
/ 18 февраля 2012

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

Если вы используете * при объявлении переменной, это означает, что veriable является указателем. Когда вы используете * как оператор, это оператор разыменования.

int *& name

просто означает, что вы берете указатель на int по ссылке. ** * и & не отменяют друг друга. **

Если у вас была такая строка кода:

var = *& var2;

тогда да, это будет так же, как:

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