Почему передача по ссылке работает только с указателями, объявленными в списке аргументов этой программы на C? - PullRequest
0 голосов
/ 28 мая 2019

Это программа 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;
}

1 Ответ

0 голосов
/ 29 мая 2019

Это не противоречит, вы просто вводите неверные атрибуты функции.

Обратите внимание на разницу между:

Объявление функции:

void read_data(int *int_ptr, float *float_ptr, char *char_ptr){...}

И вызов функции

read_data(int_ptr, float_ptr, char_ptr);

Но в приведенной ниже программе операторы "address of" передаются при вызове read_data (& a, & b, c); через список аргументов void read_data (int * int_ptr, float * float_ptr, char * char_ptr) {...}, где у нас есть операторы «содержимого», которые кажутся непоследовательными, но работают

Ваш вывод о том, что представляет список аргументов этой функции, вызывает у вас путаницу. Функция принимает не «содержимое» указателей, а, скорее, сами указатели. А поскольку оператор «address of» возвращает указатель, вполне нормально вызывать функцию, используя read_data(&a, &b, c)

...