【问题标题】:How does this print the whole array?这如何打印整个数组?
【发布时间】:2019-04-17 17:28:49
【问题描述】:

所以我在搞乱向量和 windows-api,有人建议我使用指向向量中第一个元素的指针作为函数的缓冲区。

我出去尝试用语法打印数组,它打印了整个数组,现在我想知道为什么会这样?

char test[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
std::cout << &test[0] << std::endl;
//output: abcdefghij

编辑 1: 我发现使用数组名称打印也可以,但是这段代码让我感到惊讶,因为它使用参考语法以降序打印 char 数组。但是如果不使用 refrenece 语法,我不知道为什么会这样?

for (int i = 0; i < 10; i++) {
    std::cout << &test[0] + i << " ";
}
//outputs: abcdefghij bcdefghij cdefghij defghij efghij fghij ghij hij ij j

【问题讨论】:

  • 你很幸运你只得到了这些项目,因为std::cout 需要一个以空字符结尾的数组,而你没有在该数组的末尾明确放置一个空条目。
  • " 使用参考语法" 您在这里没有使用任何参考语法。如果你的意思是&amp;test[0],这是地址操作符,它从其操作数创建一个指针,在这种情况下相当于test
  • @PaulMcKenzie 有人可能会说 OPun很幸运,因为测试会误导他/她得出错误的结论。
  • 您正在使用 std::cout 的 char* 功能来打印 c 字符串。 @PaulMcKenzie 解释说,由于您没有终止它,您可以获得比您预期更多的数据。这是未定义的行为。

标签: c++ arrays pointers reference


【解决方案1】:

&amp;test[0] 是一个指向字符的指针,指向数组中的第一个字符。

发送char *cout 相当于打印一个字符串。底层逻辑将开始将字符转储到屏幕上,直到找到一个 NULL 字符,即一个值为 0 的 char

正如其他人所提到的,您很幸运,您显然在数组结束后立即有一个零(未初始化的内存?)。否则,字符串打印机会一直运行,直到找到一个。

【讨论】:

  • 正式地,传递一个不指向空终止数组的char* 是未定义的行为。它可能打印数据并在第一个 '\0' 处停止,但由于允许编译器执行转换或操作系统处理内存访问的方式,它可能会执行其他任何操作。
猜你喜欢
  • 2021-04-03
  • 2012-05-14
  • 1970-01-01
  • 2014-04-22
  • 2013-06-02
  • 2016-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多