我一直在研究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])?
答案 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。
以&
为前缀再次获取地址,将为您提供存储地址。当然,这只是原始字符串的地址,因为正如您所观察到的那样,字符串的地址与它的第一个元素的地址一致。