ptr、ptr[0]和&;之间的差异;C字符串中的ptr[0]
我一直在研究C语言中的字符串,在以下代码中遇到了以下问题:ptr、ptr[0]和&;之间的差异;C字符串中的ptr[0],c,arrays,string,pointers,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; } 既然p指向字符串的第一个元素,那么p[0]不应该指向与p相同的地址(因此,&p[0])?p[0]不是指针,而是字符 由于您在格式字符串中请求%p,它将强制转换为一个值为0x00000066的无效指针,该值只
#include <stdio.h>
int main()
{
char *p = "foo";
printf("%p\t%p\t%p",&p[0],p,p[0]);
return 0;
}
既然p指向字符串的第一个元素,那么p[0]不应该指向与p相同的地址(因此,&p[0])?
p[0]
不是指针,而是字符
由于您在格式字符串中请求%p
,它将强制转换为一个值为0x00000066
的无效指针,该值只是字符串中第一个字符f
的ASCII值
如果打开编译器提供的所有警告,您可能会看到一个警告突出显示此转换以及它是如何成为潜在错误的
p
属于char*
类型&p[0]
类似于&(*(p+0))
,也就是说您将其取消引用为字符
,然后使用&
将其转换回指针。最终结果与原始结果相同。您几乎完全正确。指针只存储它所指向的指针对象的地址。因此,输出p
输出字符串的地址
那么[x]
在应用于这样一个地址p
时做了什么呢?它确实是*(p+x)
;也就是说,它的计算结果是存储在此地址的值加上x
。因此,在p[0]
的情况下,您得到char'f'
的ASCII值,即66
通过前缀
&
再次获取该地址,可以获得存储该地址的地址。当然,这只是原始字符串的地址,因为正如您所观察到的,字符串的地址与其第一个元素的地址一致。强制转换而不是简单的错误插入似乎相对无害。
00403024 00403024 00000066
Process returned 0 (0x0) execution time : 0.057 s
Press any key to continue.