我一直在研究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])?

最佳答案

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

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

如果您打开编译器提供的所有警告,则可能会看到一个突出显示此转换及其潜在错误的警告。
p的类型为char*&p[0]类似于&(*(p + 0)),也就是说您将其取消引用为char,然后将其转回为带有&的指针。最终结果与原始结果相同。

07-25 21:23
查看更多