Это программа 3.7 из книги Роберта Вуда "Программирование на C для ученых и инженеров". В приведенном ниже коде указатели не объявляются и не инициализируются в теле функции main (), а непосредственно в списке аргументов функции read_data ().
Обычно при написании кода я сначала объявляю 3 указателя (int * int_ptr, float * float_ptr, char * char_ptr), а затем присваиваю им адреса a, b и c. Но в приведенной ниже программе операторы «address of» передаются при вызове read_data (& a, & b, c); через список аргументов void read_data (int * int_ptr, float * float_ptr, char * char_ptr) {...}, где у нас есть операторы «содержимого», которые кажутся непоследовательными, но работают.
Кроме того, fscanf (стандартный ввод, "% d% f% s", int_ptr, float_ptr, char_ptr); хранит данные, предоставленные пользователем, по адресу указателей, тогда как я думаю, что они должны быть записаны в содержимом переменных a, b и c следующим образом:
fscanf(stdin,"%d %f %s", int_*ptr, *float_ptr, *char_ptr);
Но я ошибаюсь.
В противном случае программа работает, но если бы мне пришлось написать ее таким образом, я не смогу. Итак, я хочу, чтобы вы помогли мне понять и, возможно, предложили альтернативное решение.
/* Program 3.7- Use of functions for input and output of data */
#include <stdio.h>
int main(void) {
int a;
float b;
char c[11];
/* function prototype */
void read_data(int *, float *, char *);
void write_data(int, float, char[]);
/*call the function*/
read_data(&a, &b, c);
write_data(a, b, c);
return (0);
}
/*Function: read_data - reads an int, float and char string*/
void read_data(int *int_ptr, float *float_ptr, char *char_ptr) {
fprintf(stdout, " Supply an integer, a float and a string (max. 10 chars):");
fscanf(stdin, "%d %f %s", int_ptr, float_ptr, char_ptr);
return;
}
/* Function: write_data - displays an int, float and char string*/
void write_data(int i, float j, char k[]) {
fprintf(stdout, " The supplied data is: %d %f %s\n", i, j, k);
return;
}