我正在为毕业考试做准备,我对c编程语言有一些疑问。我将结合其中两个我有答案的问题,但我并不真正理解它们。第一个问题是选择输出数组第i个元素的值的正确表达式,这是可能的答案: (请注意,两个问题的代码都相同)
printf("%f",B[i]);
printf("%f",&B[i]);
printf("%f",B+i);
printf("%p",*(B+i));
printf("%f",*(B+i));
第二个问题是选择输入数组第i个元素值的正确表达式
scanf("%f", B[i]);
scanf("%f", B+i);
scanf("%p", B+i);
scanf("%f", &B[i]);
scanf("%f", *(B+i));
我试图编译并运行一个模拟这些问题的程序。 scanf部分适用于答案2-5,除第4个(当然在输入之后)之外,所有printfs都输出零。
float *B;
int n;
B=calloc(n,sizeof(float));
答案 0 :(得分:9)
您对正确答案的理解存在缺陷。
要使用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 :(得分:1)
float
有两种printf
浮点数和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)
与打印无关。