0

这是 Robert Wood 的“C Programming for Scientists and Engineers”中的 Program 3.7。在下面的代码中,指针没有在 main() 的主体中声明和初始化,而是直接在 read_data() 函数的参数列表中。

通常,在写代码的时候,我会先声明3个指针(int *int_ptr, float *float_ptr, char *char_ptr),然后将a、b、c的地址分配给它们。但是在下面的程序中,调用 read_data(&a, &b, c); 时会传递“地址”运算符。通过 void read_data(int *int_ptr, float *float_ptr, char *char_ptr){...} 的参数列表,我们有“内容”运算符,这看起来不一致,但有效。另外, fscanf(stdin,"%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;
}
4

1 回答 1

0

这并不矛盾,您只是在推断函数的错误属性。

注意以下之间的区别:

函数声明:

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

和一个函数调用

read_data(int_ptr, float_ptr, char_ptr);

但是在下面的程序中,调用 read_data(&a, &b, c); 时会传递“地址”运算符。通过 void read_data(int *int_ptr, float *float_ptr, char *char_ptr){...} 的参数列表,我们有“内容”运算符,这看起来不一致,但有效

你对这个函数的参数列表代表什么的推断是导致你困惑的原因。该函数不采用指针的“内容”,而是采用指针本身。并且由于“地址”运算符返回一个指针,因此可以使用以下方法调用该函数read_data(&a, &b, c)

于 2019-05-28T21:45:33.500 回答