数组和指针表示法

时间:2015-02-06 19:21:49

标签: c arrays pointers

我有点困惑。这是代码

main(){
    int i=3;
    char p[10]="abcdefdeg";
    char *ptr;
    ptr=p;
    printf("%p\n",&p[i]);     // Gets a normal address
    printf("%p\n",ptr[i]);   // Gets 0x64 
    printf("%p\n",(ptr+i));  // Gets a normal address
}

为什么ptr [i]和(ptr + i)会得到不同的结果? Aren的这两个符号是否具有相同的含义?似乎当我使用带指针的数组表示法时,它将地址的内容解释为地址......但我不知道为什么

2 个答案:

答案 0 :(得分:1)

在这种情况下,ptr[i](ptr+i)应该打印不同的值,他们会这样做。它们不一样。

实际上,ptr[i]相当于撰写*(ptr+i)

为了澄清,ptr包含一个地址,而(ptr+i)只是为您提供了另一个地址,增加了i。要在地址处获取(由ptr[i]完成),您需要使用取消引用运算符*

此外,正如评论中所述,第二个printf()应为printf("%c\n",ptr[i]);,因为它指向char类型。

答案 1 :(得分:0)

&p[i] // address of i-th element of array p
p[i] // i-th element of array p
(p+i) // p + i, -> address of i-th element of array p
*(p+i) // i-th element of array p

[]符号实际上只是一种语法糖。