#c #pointers
Вопрос:
Я учусь использовать указатели на языке Си, и у меня возникли проблемы с этой маленькой программой. В основном я хочу получить значение в параметре.
int testing(int *number) {
int num = 12;
number = amp;num;
return 0;
}
int main() {
int num;
testing(amp;num);
printf("The number is: %d", num);
return 0;
}
По сути, я хочу напечатать указатель num после того, как он пройдет функцию тестирования. Поэтому я хочу, чтобы число было 12. В настоящее время, когда я печатаю число, это случайное число. Есть какие-нибудь идеи? Спасибо.
Ответ №1:
number = amp;num;
изменяет локальный параметр (копию того, что передается). Это ничего не значит, потому number
что после этого не используется.
Вместо этого вы должны разыменовать переданный указатель, чтобы записать туда целое число: *number = num;
Ответ №2:
Это фундаментальная проблема в вашем коде. Если передать аргумент функции по ссылке, вы фактически передадите копию адреса вашего значения функции. Поэтому измените адрес внутри функции, как вы делаете со строками:
int num = 12;
number = amp;num;
не влияет на область вызывающего абонента (вашу основную).
Вы должны записать значение в позиции переменной:
*number = num
В C это помогает думать об адресах и о том, где хранятся ваши ценности. С аппаратной точки зрения аргумент функции помещается в регистр или в стек, и процессор переходит к местоположению вашей функции. Эти значения не извлекаются после завершения функции и возврата процессора.
Комментарии:
1. В C это помогает так думать, но не в C , если вы не поддерживаете очень старую базу кода. И немного придирчиво: в C на самом деле нет «передачи по ссылке». Все это передается по значению. В C есть как ссылки, так и указатели.
2. Я бы так не сказал. Когда вы используете C без STL или используете более старый C std по какой-либо причине, вам приходится работать с указателями. Более того, в терминологии языка Си вызов по ссылке относится к указателю. Только в C существует различие в терминологии, и ссылка на C также разрешается компилятором с помощью указателя/адреса. Но я понимаю твою точку зрения 😀
3. @AlexanderFratzer Верно, но насколько распространен c без stl для разработки новых материалов?
4. @klutt Во встроенных системах, например, или если у вас есть ограничения в реальном времени, памяти или руководство по стилю в критически важном контексте. Но я признаю, что C часто не является первым выбором в этих условиях, но я использую его, когда у меня есть выбор, потому что мне нравится OO, когда это имеет смысл ;). Это зависит от уровня абстракции, с которым вы работаете.
5. @chux-RestorateMonica Спасибо за совет, все сделано
Ответ №3:
Вместо этого вы должны разыменовать переданный указатель, чтобы записать туда целое число:
*number = num;