为什么这个C指针的引用值成为其内存地址

时间:2016-08-29 06:24:27

标签: c pointers

想知道为什么当下面的函数运行时,* p和p被打印出来具有相同的值。我的理解是,当* p ++运行时,这会导致p的地址递增1,但为什么这会导致* p也成为内存地址。

我也试过在没有*(只是p ++)的情况下运行代码,输出仍然是相同的,演讲代码中*的重要性是什么。

我得到的输出是:

  

1606416248 1606416248

int main() {
    int *p; 
    int a = 4;
    p = &a;
    *p++;
    printf("%d %u\n", *p, p);
}

1 个答案:

答案 0 :(得分:5)

首先,%u是用于打印地址的不正确的格式说明符。您应该使用%p打印地址,并将参数强制转换为(void *)。仅这一点就足以调用undefined behavior

然后来

  

但为什么这会导致* p也成为内存地址。

<强> Undefined behavior

当你执行*p++;时,你正在跑出界限,因为p指向单个变量,而不是数组。因此,下一次取消引用指针*p,将是无效的内存访问,从而导致UB。之后的输出无论如何都不合理。