这是Robert Wood的"C Programming for Scientists and Engineers"中的程序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 %sn", i, j, k);
return;
}
这并不矛盾,你只是推断了函数的错误属性。
请注意以下两者之间的区别:
函数声明:
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){...} 的参数列表,其中我们有"内容"运算符,这似乎不一致,但有效
你对此函数的参数列表表示什么的推断是导致你困惑的原因。该函数不获取指针的"内容",而是获取指针本身。由于"address of"运算符返回一个指针,因此使用read_data(&a, &b, c)
调用该函数是完全可以