【问题标题】:array vs pointer of char type [duplicate]数组与char类型的指针[重复]
【发布时间】:2014-11-26 12:10:34
【问题描述】:
char label[] = "Single";
char *labelPtr;
labelPtr = label;
cout<<labelPtr;;
return 0;

上面代码的输出是Single
我对输出感到困惑。

据我了解labelPtr 应该包含label[0] 的地址。那么输出不应该等于&amp;label[0]吗?

【问题讨论】:

  • 你试过cout &lt;&lt; &amp;label[0];吗?你会得到什么结果?
  • 这里是对不同行为的一个很好的解释cplusplus.com/doc/tutorial/pointers
  • 在 C++ 中 char * 是一个 C 风格的字符串,它基本上是以空字符结尾的字符数组。因此,它按预期被视为字符串。

标签: c++ arrays pointers


【解决方案1】:

std::cout 将 char* 视为指向 C 样式字符串的指针。 所以整个 C 风格的字符串都被打印出来了。

考虑强制转换为 (void*) 看看会发生什么。

【讨论】:

  • 当类型转换为void*时,将打印地址
  • 没错,但 PTA 应该自己检查一下。问题中没有具体说明他/她期望达到的结果。这就像一个练习。
【解决方案2】:
labelPtr = label;

在这个标签中指的是char数组的第一个元素。然后你让 labelptr 指向同一个数组。这意味着从现在开始,您可以像使用 label 一样使用 labelptr。

所以,两者是等价的:-

cout << label;
cout << labelptr;

【讨论】:

  • “在这个标签中指的是 char 数组的第一个元素。” - 不是真的,而是 - 当试图找出如何分配给 labelPtr 时,允许array 引用的数组进行标准转换以生成char* 值。 “您可以像使用 label 一样使用 labelptr” - 一般情况下不正确(例如,您不能使用 labelptr 调用 template &lt;size_t N&gt; void f(char (&amp;)[N]);),但对于流式传输到 @987654328 是正确的@,但那是因为 operator&lt;&lt;(std::ostream&amp;, char*) 是最佳匹配,而 label 在这种用法中也会衰减....
  • 通常当您只使用一个数组名称时,这意味着您指的是该数组的基地址,即第一个元素。其次,暂时离开 cout 并尝试 printf("%s", labelptr) 来检查我所说的“您可以像使用 label 一样使用 labelptr”的意思。如果有不一致之处,请告诉我。
  • “通常”嘿? :-) 无论如何 - 读者可以考虑我之前的评论......我没有什么要补充的。
【解决方案3】:

由于cout 认为参数是char* 类型。打印字符串的所有内容。

如果您只打印第一个字符,请尝试使用

cout<<*labelPtr;;

这将只打印第一个字符。要打印第二个字符,请使用cout&lt;&lt; *(labelPtr+1);;

【讨论】:

    猜你喜欢
    • 2018-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2021-01-26
    • 2014-04-30
    • 2017-09-03
    相关资源
    最近更新 更多