2013-10-05 61 views
0

我是一个新的学生在c语言,我只是想出了这个。我的代码:尝试打印一个&a_variable

#include <stdio.h> 
    main() 
    { 
     int i=100; 
     printf("Helloo is: %d\n", i); 
    } 

,输出是:Helloo is: 100到这里是所有伟大的!如果我修改代码,这

#include <stdio.h> 
    main() 
    { 
     int i=100; 
     printf("Helloo is: %d\n", &i); // the &i is the change 
    } 

当我编译它,我得到一个警告:warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat].

好吧,我得到的编译器的消息,但我很好奇,所以我想运行的程序,我也得到这个输出:Helloo is: -1078455636如果我再次运行该程序,我得到不同的输出!所以:

  • 所有这些数字是什么?变量i的内存地址?
  • 为什么每次运行程序我都会得到不同的输出结果?

谢谢!

+3

这个问题基本上是“什么是指针”,并首先为我说现在我学习c它在每一个教程和C. – us2012

+1

每一个大学课程回答。其次,我在本书的第一章,我不知道什么是指针。我只是把&因为我在函数scanf(“%d”,&变量)中看到它;我也说过在printf中尝试它。 – yaylitzis

回答

1
printf("Helloo is: %d\n", &i); // the &i is the change 

这是不确定的行为

您需要指定正确的格式说明。

要打印地址,你需要使用%p和标准说%p需要void *,所以做投。

printf("Helloo is: %p\n", (void *) &i); 
+1

谢谢@Gangadhar!我的目标不是打印变量的地址,而是让您获得很好的信息;)还有一个问题!我很难理解什么是'(void *)' – yaylitzis

+0

我应该学习,因为它是? %p需要这个(void *)才能工作? – yaylitzis

+2

知道未知的事物是好的,而不是盲目追随它.'void *'是通用指针。 [见此](http://www.c4learn.com/void-pointers-in-c-programming.html) – Gangadhar

1

所有这些数字是什么?变量i的内存地址?

它们是将i的地址重新解释为整数的一种形式 - 未定义的行为:不允许传递地址来代替整数。

为什么每次运行程序时都会得到不同的输出?

变量的地址一直在改变,所以将地址重新解释为整数的代码始终获取不同的数据。

如果要正确打印地址,使用%p格式说明,投地址void*

printf("Hello is: %p\n", (void*)&i); 
1

&是地址运算符,&i是一个指向int&i的值因为变量i的地址每次运行该程序而不同时发生更改。

此外,打印指针的地址,使用%pvoid *类型:

int i=100; 
printf("Helloo is: %d\p\n", (void *)&i); 
+0

谢谢@余浩!我的目标不是打印变量的地址,而是获得我很好的信息;)我很难理解什么是(void *)。我应该学习它吗? %p需要这个(void *)才能工作? – yaylitzis

+1

@ Nat95'void *'是泛型指针,是的,'%p'需要使用'void *'。我认为你首先需要更多地了解指针。你会在那里了解到'void *'。 –

相关问题