代码之家  ›  专栏  ›  技术社区  ›  Danserk

为什么对于指针*p,p[0]是存储在p的地址,p[1]是p本身的地址?

  •  0
  • Danserk  · 技术社区  · 2 年前

    密码

    int n = 25;  
    int *p = &n;  
    printf("%x\n %d\n %x\n", p, p[0], p[1]);
    

    返回:

    \<adress-of-p  
    25  
    \<adress-of-p>  
    

    当然,如果不是在K&R表示

    “如果pa是指针,表达式可以将其与下标一起使用;pa[i]与*(pa+i)相同。”。

    3 回复  |  直到 2 年前
        1
  •  2
  •   Vlad from Moscow    2 年前

    这句话

    printf("%x\n %d\n %x\n", p, p[0], p[1]);
    

    调用未定义的行为有两个原因。

    第一个是,要输出指针,应该使用正确的转换说明符。第二个问题是,您不能像这样取消对指针的引用 p[1] 不指向有效对象的。

    相反,你可以写一些例子

    printf("%p\n %d\n %p\n", ( void * )p, p[0], ( void * )( p + 1 ) );
    
        2
  •  1
  •   David Grayson    2 年前

    当你评估 p[1] 在代码中,您正在调用未定义的行为,以便程序可以执行任何操作。

    这是未定义的行为,因为 p 指向 n 它只是一个整数,不是一个整数数组。所以 p[0] N 但是 p[1] 没有定义。基本上这是一个数组溢出错误。

        3
  •  0
  •   Caleth    2 年前

    您的程序具有未定义的行为,因为它取消了对不指向任何对象的指针的引用。

    您经历的特定症状与读取函数中的下一个变量一致