Путаница в C ++ - PullRequest
       11

Путаница в C ++

2 голосов
/ 20 сентября 2010

В чем разница между следующими механизмами передачи параметров в C ++?

void foo(int &x) 
void foo(int *x)
void foo(int **x)
void foo(int *&x)

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

Ответы [ 2 ]

6 голосов
/ 20 сентября 2010
void foo(int &x)

передает ссылку на целое число.Это параметр ввода / вывода и может использоваться как обычное целое число в функции.Значение передается обратно вызывающей стороне.


void food(int *x)

передает указатель на целое число.Это параметр ввода / вывода, но он используется как указатель и требует разыменования (например, *x = 100;).Вам также необходимо убедиться, что оно не равно нулю.


void foo(int **x)

передает указатель на указатель на целое число.Это входной / выходной параметр целочисленного указателя типа.Используйте это, если вы хотите изменить значение целой точки (например, *x = &m_myInt;).


void foo(int *&x)

передает ссылку на указатель на целое число.Как и выше, но нет необходимости разыменовывать переменную указателя (например, x = &m_myInt;).


Надеюсь, что это имеет смысл.Я бы рекомендовал использовать typedefs, чтобы упростить использование указателей и ссылочных символов.

0 голосов
/ 22 января 2011

Просто добавлю: я думаю, что ваш интервал вводит в заблуждение.Может быть, все станет немного яснее, если вы измените это.

, &, * и т. Д. Являются частью типа, поэтому сохраните их с типом:

void foo(int& x) 
void foo(int* x)
void foo(int** x)
void foo(int*& x)

int & является ссылкой на int,int * - указатель на int, int ** - указатель на указатель на int и так далее.Вам все еще нужно читать типы справа налево - int * и быть ссылкой на указатель на int.Но это согласуется.

Я думаю, что это легче читать и лучше понять, что имеется в виду.

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