2010-07-18 116 views
2

我学习C语言编程和我有指针一个简单的问题...学习C - 指针和内存寻址

我用下面的代码玩弄指针:

#include <stdio.h> 

int main (int argc, const char * argv[]) { 

int * c; 

printf("%x\n",c); 
return 0; 
} 

当我打印C的值,我得到一个0。但是,当我打印& C(即输出(“& X \ n”,&三)我得到内存中的地址...

我不应该打印时要在内存中获取地址e指针(即的printf( “%X \ n” 个,C)?

--- 编辑 ---

#include <stdio.h> 
#include <stdlib.h> 

int main (int argc, const char * argv[]) { 

    char * a = malloc(11); 
    printf("String please\n"); 
    scanf("%s",a); 
    printf("%s",a); 

} 

的问题是,为什么的printf( “%S”,一个)返回字符串,而不是存储在一个地址?

不应该使用* a来跟随指针,然后打印字符串吗?

+1

您还没有初始化的指针打印单个字符,所以它的价值可以是任何东西。 – 2010-07-18 16:59:53

回答

11

您当前的程序不正确。您在首次使用前定义变量并且不要设置值。初始值不保证为c,但你很幸运,它等于0。这意味着c指向无处。当您打印&c时,您打印变量c本身的地址。所以实际上两个版本都打印地址

+0

所以,指针本身在内存中有一个地址,这将是&c。指针本身存储一个地址,这将是c? – AlexBrand 2010-07-18 17:09:30

+1

@alexBrand是的,每个变量都有一个地址,即使它是指针。你可以定义指向int的指针:'int ** pc =&c;' – Andrey 2010-07-18 17:11:43

+0

非常感谢。所以基本上这个指针被初始化了,但它没有指向任何地方......这是因为运气还是自动初始化为NULL? – AlexBrand 2010-07-18 17:14:30

0

int * c;如果您输出c的值,则会返回一个值,该值应被解释为整数值的内存地址。在你的例子中,它可能是0或者完全不同的东西,因为你没有初始化c。

如果您打印& c,您将获得指针c(存储在堆栈中)的内存地址。

0
#include <stdio.h> 

int main (int argc, const char * argv[]) { 

int * c; 
int a=10; 
c = &a; 

printf("%x\n",c); 
return 0; 
} 

这可能会说明将int指针指向内存中的某些内容时会发生什么。

1

printf实际上是一个相当复杂的函数,可以通过给它一个正确的格式说明符来做各种各样的技巧。

在你的字符串例如:

printf("%s", a) 

的“%s的”告诉printf的下列变量应被视为一个字符串函数。在C中,字符串是指向一个或多个char的指针,由包含0的char终止。这是一个非常常见的请求,这就是printf支持格式说明符“%s”的原因,它触发了相对复杂的行为。如果要打印包含在字符串指针的地址,你必须使用你发现较早的格式:

printf("%x\n",a); 

它会告诉printf的处理的内容作为一个无符号整数,并在基地16打印。

* a只是a指向的值,它只是单个字符。

您可以用

printf("%c", *a); 
+0

非常感谢。所以基本上printf会指出你想要打印的内容,然后决定它是否应该跟随指针? – AlexBrand 2010-07-18 18:38:18

+0

这是正确的。 – 2010-07-18 20:00:42

+0

我想补充一句,C假设你知道你在做什么,并且不会试图阻止你在脚下射击自己。例如: int i = 10; printf(“%s”,i); 也就是说,“声明一个整数变量i,将它设置为10,然后打印出来,就像它是一个字符串一样对待” 这是有效的C语法,并且会编译时没有错误(尽管几乎所有的现代编译器都会发出警告)。当你尝试运行这个程序时,你会得到一个分段错误,因为10对于一个内存地址来说不是有效的值。 – 2010-07-18 20:21:12