получить значение указателя из параметра

#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;