C字符串中ptr,ptr [0]和&ptr [0]之间的区别

时间:2018-11-02 19:40:21

标签: c arrays string pointers

我一直在研究C语言中的字符串,并且在以下代码中遇到了以下问题:

#include <stdio.h>
int main()
{
   char *p = "foo";
   printf("%p\t%p\t%p",&p[0],p,p[0]);
   return 0;

}

我有以下输出:

00403024        00403024        00000066
Process returned 0 (0x0)   execution time : 0.057 s
Press any key to continue.

既然p指向字符串的第一个元素,p [0]是否应该指向与p相同的地址(因此,&p [0])?

2 个答案:

答案 0 :(得分:4)

p[0]不是指针,而是char

由于您在格式字符串中要求%p,因此它会强制转换为值0x00000066(即f的ASCII值)的无效指针。字符串中的第一个字符。

如果您打开编译器提供的所有警告,则可能会看到一个突出显示此转换及其潜在错误的警告。

p的类型为char*&p[0]类似于&(*(p + 0)),也就是说您将其取消引用为char,然后使用&将其转为指针。最终结果与原始结果相同。

答案 1 :(得分:2)

您几乎完全正确。指针仅存储它指向的指针的地址。因此,输出p将输出字符串的地址。

那么[x]应用于这样的地址p时会做什么?它确实*(p+x);也就是说,它求值为该地址存储的值加上x。因此,对于p[0],您将获得char 'f'的ASCII值,即66。

&为前缀再次获取地址,将为您提供存储地址。当然,这只是原始字符串的地址,因为正如您所观察到的那样,字符串的地址与它的第一个元素的地址一致。