проблемы с пониманием указателя C в следующем

#c

#c

Вопрос:

У меня есть следующая функция:

 int do_something(...,const float writeArray[],...){
printf("%d",*writeArray);
return 0;
}
 

как я использую эту функцию:

 do_something(...,amp;data[0],...);
 

где data[0]=1

очевидно, что мой код не так прост, но это иллюстрация проблемы. Когда я запускаю do_something, я получаю значение printf очень большого числа, например 23259894325. Что я делаю не так? Как мне сделать его printf 1 таким, каким он должен быть?

Ответ №1:

 printf("%d",*writeArray);
 

Во-первых, вы печатаете первый элемент массива действительно странным образом. Если вы хотите это сделать, сделайте writeArray[0] так, чтобы другие люди могли прочитать ваш код.

Во-вторых, %d предназначен для печати целых чисел, но writeArray полон чисел с плавающей запятой. Попробуйте использовать %f . Вам нужно использовать правильную строку формата для каждого типа.

 do_something(...,amp;data[0],...);
 

Это действительно сбивает с толку. Вам нужен указатель на первый элемент массива? Или вы просто пытаетесь передать весь массив? Если вы хотите передать массив (как предполагает ваша более поздняя сигнатура функции), просто сделайте это:

 do_something(...,data,...);
 

Массивы превращаются в указатели, когда вы все равно передаете их функциям.

Если вам действительно нужен указатель, измените свою вторую сигнатуру функции, чтобы показать, что:

 int do_something(...,const float *writeArray,...){
 

Комментарии:

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

2. @mugetsu — я настоятельно рекомендую узнать, что означают предупреждения компилятора, а не слепо следовать им.

3. @mugetsu: использование %d не является ошибкой. Он просто не достигает того, чего вы хотите. Есть разница.

4. что касается странного способа, которым я имел дело с do_something(…, amp;data[0],…), это что-то в чужом коде. Я не слишком знаком с c, поэтому меня это тоже смутило, вероятно, причина, по которой я не думал, что неправильно печатаю свои данные. Я тоже не совсем уверен, в чем смысл :/

Ответ №2:

%d указывает целое число со знаком. Используйте %f вместо этого.

Ответ №3:

вы передаете значение с плавающей точкой, ваш printf пытается напечатать int