C (не C++) проходной вопрос / справочное интервью
У меня есть список вопросов, которые я хотел бы задать, чтобы проверить навыки кандидата C для программирования встроенных систем. Один из стандартных вопросов, который у меня есть, который также есть во многих открытых списках вопросов, таков, но я начинаю думать, что это плохой вопрос:
"Объяснить или сопоставить передачу по значению и передачу по ссылке в C"
Я говорю собеседнику, что вопрос не имеет ничего общего со ссылками на C++, и я ищу объяснение передачи указателя на переменную вместо переменной и как вызываемый абонент может изменить переменную, на которую ссылается указатель. Дополнительные пункты для объяснения того, как передача указателей на структуры более эффективна.
Вот вопрос: действительно ли в Си есть "передача по ссылке"?
Подпись вызываемого абонента четко определяет, что передается. Это не значит, что вы можете передать x или &x функции и заставить компилятор выяснить, что делать. Так что я бы сказал, что все это C, передаваемый по значению, а передача по ссылке на самом деле просто передает значение указателя.
Есть ли что-то принципиально другое в
void f(int *xarg);
...
int x;
int *xp = &x;
f(xp);
против
f(&x);
Спасибо Андрей
5 ответов
Там нет передачи по ссылке в C.
Самое близкое, что вы можете получить, это передать по указателю, который на самом деле является передачей по значению (за исключением того, что копируется указатель, а не объект-указатель).
Итак, вы правы.
Нет - в C нет передачи по ссылке - все проходит по значению. Но я думаю, что для собеседника было бы немного трудно, если бы он объяснил переход по ссылке в терминах указателей, и вы отклонили их из-за этого, если только вы не ищете языкового адвоката.
C не имеет передачи по ссылке.
Почему бы не называть это "передачей по указателю"?
C всегда передается по значению. На самом деле нет никакой разницы между фрагментами кода, которые вы разместили. На самом деле оптимизирующий компилятор, вероятно, в любом случае будет генерировать один и тот же код.
Конечно, у C есть "передача по ссылке"... это хорошо зарекомендовавший себя Comp. Sci. Термин, который широко используется для обозначения практики предоставления доступа к переменной из вызывающего контекста. Важно, что указанная переменная передается по ссылке. Указатель на него, который передается по значению, является просто механизмом для этого, доступным в C.
Любой хороший программист на C должен точно знать, что вы подразумеваете под своим первоначальным вопросом, и не путать его со "ссылками" в соответствии с C++ и т. Д.
Из проекта стандарта C99:
Тип указателя может быть получен из типа функции, типа объекта или неполного типа, называемого ссылочным типом. Тип указателя описывает объект , значение которого предоставляет ссылку на объект ссылочного типа. Тип указателя, полученный из ссылочного типа T, иногда называют "указателем на T". Конструкция типа указателя из ссылочного типа называется "выводом типа указателя".
(Тем не менее, ваше понимание того, что указатели передаются как значения, является важной частью понимания практической работы языка и само по себе ценно.)
(Мета-обсуждение - я, скорее, думаю, что был один уважаемый участник SO, возражающий против этого, а другие подпрыгивают на подножке... соответствие в нынешних ответах "C не хватает по ссылке" определенно не репрезентативно принятой в отрасли терминологии. Не указывать туда пальцами - я даже не пытался выяснить, кто первым отреагировал. Как и при оценке искусства для конкурсов, опубликованных критических анализов и т. д. - вы не сможете сделать это честно и ответственно, если не создадите свою собственную мнение, прежде чем рассматривать другие. Тем не менее, еще одно правдоподобное объяснение заключается в том, что логика в самом вопросе смягчил всех:-))