2015-02-06 50 views
-4

我有点困惑。下面的代码数组和指针表示法

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)得到不同的结果?这两个标记不是具有相同的含义吗?看起来,当我用指针数组符号表示解释地址的内容作为地址...但我不知道为什么

+0

如果你想要访问数组中的元素,你想'*(ptr + i)' – MightyPork 2015-02-06 19:23:13

+0

@MightyPork不,我不想要内容,我想要地址。我只是不知道为什么我不能用ptr [i]来做。 – BsD 2015-02-06 19:25:29

+0

因为'ptr [i]'实际上只是'*(ptr + i)'的糖' – MightyPork 2015-02-06 19:26:22

回答

1

在这种情况下,ptr[i](ptr+i)应该打印不同的值,他们这样做。他们不一样。其实ptr[i]相当于写*(ptr+i)

为了澄清,ptr拥有一个地址和(ptr+i)只是给你另一个地址,增加i。要获取地址处的(由ptr[i]完成),您需要使用解引用运算符*

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

+0

你能告诉我他们为什么不一样吗? – BsD 2015-02-06 19:26:36

+0

他们不应该打印不同的值。如果第二个print语句中的UB(由于不匹配的printf格式说明符)恰巧是良性的,那么它们极有可能。 – Deduplicator 2015-02-06 19:28:39

+0

我的意思是没有ptr [我]只是意味着得到的ptr的内容添加我,并得到这个地址 – BsD 2015-02-06 19:29:30

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 

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