【问题标题】:How does &x vary from x if x is a pointer?如果 x 是指针, &x 与 x 有何不同?
【发布时间】:2011-09-01 10:52:58
【问题描述】:

所以...我有以下代码:

int main(void)
{
const char *s="hello, world";
cout<<&s[7]<<endl;

return 0;
}

它会打印“世界”...但是我不明白为什么会这样:

int main(void)
{
const char *s="hello, world";
cout<<s[7]<<endl;

return 0;
}

只会打印“w”(我所做的只是去掉了与号),但我认为那是“地址”运算符......这让我想知道你为什么需要它以及它的功能是什么?

【问题讨论】:

    标签: c++ pointers ampersand


    【解决方案1】:

    s[7] 是字符'w',所以&amp;s[7] 成为字符'w'地址。当您将char* 类型的地址 传递给cout 时,它会打印从字符开始到作为字符串结尾的空字符的所有字符,即继续打印来自@987654328 的字符@ 向前直到找到 \0 。这就是world 的打印方式。

    就是这样,

    const char *s="hello, world";
    const char  *pchar = &s[7]; //initialize pchar with the address of `w`
    cout<< pchar <<endl; //prints all chars till it finds `\0` 
    

    输出:

    world
    

    但是,如果你想打印s[7]的地址,即&amp;s[7]的值,那么你必须这样做:

    cout << ((void*)&s[7]) << endl; //it prints the address of s[7]
    

    现在我们传递了void* 类型的地址,因此cout 将无法推断它过去使用char* 类型地址推断的内容。 void* 隐藏所有关于地址内容的信息。所以cout 只是打印地址 本身。毕竟,这是它最多得到的。

    在线演示:http://www.ideone.com/BMhFy

    【讨论】:

      【解决方案2】:

      s[7] 是一个字符。 (您可以索引指向数组的指针,就好像它只是数组的名称一样)。

      &s[7] 是指向索引 7 处的字符的指针。它的类型是 char*,因此流插入器将其视为 char*。

      【讨论】:

        【解决方案3】:

        您的标题与您的问题完全不符。

        因为s 是一个指向char(又名C 风格字符串)的指针,所以s[7] 是一个char。因为s[7] 是一个字符,所以&amp;s[7] 是一个指向字符(又名C 风格字符串)的指针。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-05
          • 2016-05-06
          • 2015-10-25
          相关资源
          最近更新 更多