【问题标题】:Why do & behave differently for strings? [duplicate]为什么 & 对字符串有不同的行为? [复制]
【发布时间】:2015-02-24 14:15:21
【问题描述】:
#include <iostream>

#include <string.h>

using namespace std;

int main()

{

    char x[100]="hello";

    int s=strlen(x);

    cout<<&(x[0]);

}

如果我编译并运行它,

输出是你好

为什么输出的不是字符'h'的地址?

【问题讨论】:

  • 试试cout&lt;&lt;(void*)&amp;(x[0]);
  • 这个问题已经回答了很多次了
  • "为什么输出的不是字符'h'的地址?" – 是的,你只需要适当地解释它。
  • @texasbruce 我尝试搜索类似的问题。但是搜索这样的问题并不容易,因此给您带来的不便,我深表歉意。

标签: c++ string char


【解决方案1】:

因为operator &lt;&lt;const char* 重载以打印const char* 指向的以零结尾的C 字符串。

【讨论】:

  • 如果您实际上试图打印地址并且 char* 实际上并不指向以零结尾的字符数组,这会导致有趣的结果。
  • @Cubic 一个简单的演员 void* 服务很好,如果你想要地址。
【解决方案2】:

指针不保存信息是指向单个对象还是数组的第一个对象。还要考虑到表达式中的数组名称被转换为指向它们的第一个元素的指针。因此,例如,如果您有一个像这样的const char * 类型的指针

const char *p = "Hello";

那么自然会期待这个说法

std::cout << p << std::endl;

将输出字符串文字“Hello”。

如果你想输出字符串字面量的第一个元素的地址,你必须使用另一个重载的operator &lt;&lt; 作为void * 类型的指针

std::cout << ( const void * )p << std::endl;

因此,如何处理char * 类型的指针存在一个两难的问题,解决的办法是将此类指针视为指向字符串第一个元素的指针,从而输出整个字符串。

【讨论】:

  • 请问您为什么不断回滚完全有效的编辑以改进您自己答案的格式?
  • @Jefffrey 是的,你可能会问。:) 我没有回滚编辑。看来我们正在同时编辑,当我保存编辑时,您的编辑已被丢弃。:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2013-10-21
  • 2014-06-24
  • 2013-10-30
相关资源
最近更新 更多