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

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

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

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

 SingleNegationElimination20 сент. 2010 г., 01:49
Это домашнее задание?
 visitor20 сент. 2010 г., 10:18
Параметры передаются по ссылке, если есть& условное обозначение. В противном случае они передаются по значению (указатели передаются по значению).
 user24639220 сент. 2010 г., 01:51
Нет, я изучаю C ++, но это выглядит грязно, и я просто запутался.

Ответы на вопрос(2)

Решение Вопроса
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, чтобы упростить использование указателей и ссылочных символов.

 user24639220 сент. 2010 г., 02:21
Большое спасибо, ребята!
 Vargas20 сент. 2010 г., 02:15
Последний является указателем на ссылку, он все равно должен быть разыменован. Ссылка на указатель будет объявлена ​​какvoid foo(int &*x)
 Chubsdad20 сент. 2010 г., 04:49
@Vargas: ссылка на указатель - это int * & x, а не int & * x. То, что вы упомянули, это «указатель на ссылку». Кстати, C ++ не позволяет указатель на ссылку.
 Dan20 сент. 2010 г., 21:50
@Chubsdad +1; @Vargas, читайте справа налево («x - это ссылка на указатель на int»)

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

& & * и так далее является частью типа, так что держите его с типом:

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

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

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

Ваш ответ на вопрос