澄清 C 中指针的左值、右值行为

Clarification over lvalue , rvalue behaviour of pointers in C

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>

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

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

    return 0;
}

代码输出:-

初始化指针p的地址:3221221820

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

为什么是"


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

这符合预期。


你有

当您第二次尝试打印地址时,使用

%d 而不是 %u

请注意以下修改后的源代码中的粗体更改:

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

最值得注意的是,您应该使用 %p 来打印指针值,而不是 %u,正如在此线程的另一个答案中已经指出的那样。


指针的标准格式说明符是%p。为了安全起见,您应该始终在对 printf 的调用中明确地将指向 (void*) 的指针强制转换。不保证任何其他格式说明符都可以使用指针值。

例如

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

您看到的区别只是第一个格式说明符是 %u ,它将指针值打印为无符号整数,而第二次使用 %d 将其打印为有符号整数。