我确定我在这里遗漏了一些基本的东西,试图弄清楚为什么我会得到以下输出。
#include <stdio.h>
int main(int argc, char** argv) {
double val1 = 20.0;
double *p1;
p1 = &val1;
printf("p1 is %f\n", p1);
return 0;
}
输出:
p1 is 0.000000
但是,如果我在p1之前打印val1的值,它似乎被分配给正确的值。
#include <stdio.h>
int main(int argc, char** argv) {
double val1 = 20.0;
double *p1;
p1 = &val1;
printf("val1 is %f\n", val1);
printf("p1 is %f\n", p1);
return 0;
}
输出:
val1 is 20.000000
p1 is 20.000000
答案 0 :(得分:4)
好吧,你传递给printf
指针加倍,而不是双倍:
printf("p1 is %f\n", *p1);
应该这样做!
注1:小心!将错误的类型传递给printf
(在这种情况下,double*
而不是double
会导致未定义的行为。
注2:变量函数的参数(例如printf
)将遭受算术促销,因此float
值将作为double
,short
和{{1}传递} char
,等等。因此,您可以毫不费力地将int
和float
传递给double
格式规范。
注3:但要注意! %f
不会被提升为float*
,因为它不是算术类型(它是指针)。这就是为什么double*
函数族具有比*scanf()
更多的格式说明符的原因:因为前者采用指针而后者采用指针。
答案 1 :(得分:2)
printf("p1 is %f\n", *p1);
^
答案 2 :(得分:1)
要引用指针指向的内存位置的值,您需要取消引用它。
double *p;
然后,*p
而不是p
获取该值。
请记住,p
仅仅是指针。
以你的例子为例:
printf('p1 is %f\n",*p1)