指向双初始化的指针

时间:2014-04-30 17:41:52

标签: c pointers

我确定我在这里遗漏了一些基本的东西,试图弄清楚为什么我会得到以下输出。

#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

3 个答案:

答案 0 :(得分:4)

好吧,你传递给printf指针加倍,而不是双倍:

printf("p1 is %f\n", *p1);

应该这样做!

注1:小心!将错误的类型传递给printf(在这种情况下,double*而不是double会导致未定义的行为

注2:变量函数的参数(例如printf)将遭受算术促销,因此float值将作为doubleshort和{{1}传递} char,等等。因此,您可以毫不费力地将intfloat传递给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)