我一直在研究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
,然后将其转回为带有&
的指针。最终结果与原始结果相同。