Сколько существует способов printf () и scanf () для переменной float *? - PullRequest
0 голосов
/ 04 июня 2019

Я готовлюсь к выпускному тесту, и у меня есть несколько вопросов, касающихся языка программирования c.Я объединю два из этих вопросов, на которые у меня есть ответы, но я действительно не понимаю их.Первый вопрос - это выбрать правильное выражение, которое выводит значение i-го элемента массива, и это возможные ответы: (обратите внимание, что код для обоих вопросов одинаков)

  1. printf("%f",B[i]);
  2. printf("%f",&B[i]);
  3. printf("%f",B+i);
  4. printf("%p",*(B+i));
  5. printf("%f",*(B+i));

Второй вопросВыберите правильное выражение, которое вводит значение i-го элемента массива

  1. scanf("%f", B[i]);
  2. scanf("%f", B+i);
  3. scanf("%p", B+i);
  4. scanf("%f", &B[i]);
  5. scanf("%f", *(B+i));

Я попытался скомпилировать и запустить программу, которая имитирует эти вопросы.Часть scanf работает для ответов 2-5, и все printfs выводят ноль, кроме 4-го (конечно, после ввода).

float *B;
int n;
B=calloc(n,sizeof(float));

Ответы [ 2 ]

9 голосов
/ 04 июня 2019

Ваше понимание того, какие ответы являются правильными, ошибочно.

Чтобы напечатать значение типа float с помощью printf, вам нужно использовать спецификатор формата %f и передать значение типа float.Чтобы прочитать значение типа float с scanf, вы также используете спецификатор формата %f, но передаете значение типа float *.

Что касается индексации массива, запись A[N] точноэквивалентно *(A + N) и имеет тип элемента массива, а &A[N] точно соответствует A + N и имеет указатель типа на элемент массива.

Исходя из этого, мы имеем следующее:

printf("%f",B[i]);    // Correct
printf("%f",&B[i]);   // Incorrect, passing a float *, expected float
printf("%f",B+i);     // Incorrect, passing a float *, expected float (same as prior)
printf("%p",*(B+i));  // Incorrect, %p is used to print a pointer (expects a void *)
printf("%f",*(B+i));  // Correct

scanf("%f", B[i]);    // Incorrect, passing a float, expected float *
scanf("%f", B+i);     // Correct
scanf("%p", B+i);     // Incorrect, %p is used to read a pointer (expects a void *)
scanf("%f", &B[i]);   // Correct
scanf("%f", *(B+i));  // Incorrect, passing a float, expected a float *
1 голос
/ 04 июня 2019

float

Существует 2 способа printf плавания и 1 способ scanf их.

printf("%f",  my_float);
printf("%lf", my_float); // works fine but bad style

scanf("%f",  &my_float);

(В самом старом стандарте C printf не разрешено %lf)


float*

Существует один способ printf самого указателя:

printf("%p", ptr);

Нет смысла читать указатель с scanf, но вы можете прочитать в память, указанную указателем ptr как:

scanf("%f",  ptr); // no & needed, it is already a pointer

Все остальное из ваших примеров не имеет особого смысла. Печать адреса не печатает float. Применение к арифметике различных форм, таких как &B[i] против *(B+i), не имеет никакого отношения к печати.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...