了解用C

问题描述:

空指针所以,想象我有这个了解用C

main() { 
    int a = 5; 
    int *p; 
    printf("p: %d", (void*)p); 
} 

为什么我会投的* P在printf语句?但是,如果我这样做...

p = &a; 
printf("p: %d", *p); 

这次我不必施放?

所以我的问题是,我是否需要每次都将void抛出到空指针?

+0

我生锈的C,但我要采取一个刺,并说,因为你隐式地初始化指针与'p =&p;'语句? –

+0

我的意思是说p =&a; –

+1

要打印一个指针的地址,你应该使用'%p'而不是'%d','%p'格式需要转换'(void *)' –

要打印指针值(NULL或其他方式),则必须使用%p转换说明,它预计其相应的参数有void *类型:

printf("p = %p\n", (void *) p); 

这可能是唯一的一次C你需要明确将一个指针值转换为void *(如果它已经不是void *,反正)。之所以要组合printf如何读取其参数,可变参数函数中的默认类型促销以及其他一些我尚未弄清楚如何解释的事情。

请注意,您正在投射值p(指针),而不是指向的值。

在第二个print语句,

printf("*p = %d\n", *p); 

要打印的东西p的价值,这是一个整数。 表达式*p具有类型int,这是%d转换说明符所期望的。

在第一个示例中,您正在打印指针本身的值,但使用了错误的格式说明符。

printf("p: %d", (void*)p); 

应该是

printf("p: %p", (void*)p); 

原因是,通过%d指定一个int可能不是大小作为指针相同。演员的原因,是因为%p打印了一个void*指针的值。但是请注意:在你的例子中,int *p没有任何意义,所以打印它的值是没用的。

在第二个示例中,您正在按指针打印指向的值,并且不需要转换,因为类型是一致的。

printf("p: %d", *p); 
+0

想要什么是存储在内存..不是内存地址。我试图解引用它...你是说我无法解引用空指针吗? –

+1

@YusufJama是的。一个'void *'指针指向一个不确定的对象,所以你不能解引用它。像malloc()这样的函数返回一个void *指针,以便它可以分配给任何数据类型。但相反,使用'%p'格式的'printf'需要定义一个'void *'指针。 –

+0

如果指针设置为p =&a,该怎么办?为什么我不需要一个虚拟空间? –