【问题标题】:Difference between ptr, ptr[0] and &ptr[0] in C stringsC字符串中ptr、ptr[0]和&ptr[0]的区别
【发布时间】:2018-11-02 19:40:20
【问题描述】:

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

【问题讨论】:

    标签: c arrays string pointers


    【解决方案1】:

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

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

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

    p 的类型为 char*&amp;p[0] 就像 &amp;(*(p + 0)) 一样,也就是说您将其取消引用到 char,然后将其转回带有 &amp; 的指针。最终的结果和原来的一样。

    【讨论】:

    • 强制转换而不是简单的误解似乎比较……无害。
    【解决方案2】:

    你几乎是对的。指针只存储它指向的指针的地址。所以输出p 会输出字符串的地址。

    那么[x] 应用于p 这样的地址时会做什么?它确实*(p+x);也就是说,它的计算结果是存储在该地址加上x 的值。所以在p[0]的情况下,你会得到字符'f'的ASCII值,即66。

    通过以&amp; 为前缀再次获取该地址,即可为您提供存储地址。当然,这只是原始字符串的地址,因为正如您所观察到的,字符串的地址与其第一个元素的地址一致。

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 2016-05-20
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2020-08-03
      相关资源
      最近更新 更多