2011-05-26 36 views
0
#include<stdio.h> 

int main() 
{ 
    int i = 10; 
    int *p = &i; 

    printf("\n address of initialized pointer p: %u \n", p); 
    p = &(*p); 
    printf("\n modified address of initialized pointer p:%u value:%d valuez address: %d \n", p, *p, &(*p)); 

    return 0; 
} 

代码输出: -澄清过左值,在C的指针的右值行为

初始化指针p的地址:3221221820

初始化指针p的修改地址:3221221820值:10 valuez地址: -1073745476

为什么“&(* p)”,在赋值语句和printf语句中的行为不同?

更新 对不起,只是格式说明符错误在printf;)。谢谢你的回复和指出。

回答

4

您在printf中使用了不正确的格式说明符。使用%d打印地址将不起作用。相反使用%p。 [%u对于打印地址也是不正确的。]

This按预期工作。

+0

它在%p和%u之间有什么不同? – Hemanth 2011-05-26 12:17:01

+0

'%u'用于打印无符号整数,'%p'用于指针。 – 2011-05-26 12:17:54

+0

感谢Prasoon,还有一个疑问,当我使用%p我得到0x7fbffff1bc,但是当我将由%u - 3221221820打印的值转换为十六进制时,我只得到bffff1bc。那么当我使用%p时,附加的额外0x7f是什么? – Hemanth 2011-05-26 12:19:59

1

指针的标准格式说明符是%p。为了安全起见,您应该在拨打printf时明确地将指针投射到(void*)。任何其他格式说明符不保证与指针值一起使用。

例如

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

你看到的差别只是在于,所述第一格式指定符是%u打印出指针的值作为无符号整数并且正在使用%d它打印它作为一个带符号的整数的第二次。

+0

如果该值已经是一个指针,那么将它转换为“void * '做?我可以看到它留在C++中的问题(继承和运算符重载可能会导致问题),但是什么使它在C中很危险? – cHao 2011-05-26 12:20:12

+0

@cHao:虽然不常见,但指向不同类型的指针可以在C中具有不同的表示形式。'%p'格式说明符要求相应的参数具有“指向void类型的指针”类型,所以如果您拥有的变量是指向其他的东西,然后严格地说,你需要将其转换为符合'printf'的要求。 – 2011-05-26 12:25:15

1

你有

%d而不是%u当你要打印的地址第二次。

注以粗体显示的变化在下面的修改的源:%U值:: 初始化指针p的

的printf(“\ n改性地址%d valuez地址:%U \ n “,p,* p, &(* p));

最值得注意的是,如another answer on this thread中已经指出的那样,最应该使用%p来打印指针值而不是%u。