字符数组上的加法

Addition on array of char

本文关键字:数组 字符      更新时间:2023-10-16

这可能是一个愚蠢的问题。玩C++,发现这行代码让我有点困惑

char buffer[7] = {'0', '1', '0', '9', '0', '1'};
// It prints 010901
printf("%s", buffer);
// It prints 0901
printf("%s", buffer+2);

为什么我们可以(+ 2(缓冲区变量,就像将2个字符向右移动一样?

在这样的上下文中,数组名称buffer"降级"为指向第一个值的指针。由于 C 和 C++ 支持指针算法,并且字符串表示为指向字符数组的指针,因此很好。

请注意终止''字符,这是隐含的,因为您指定的大小大于为其提供的初始化数据。

不过,您的代码可以简化为:

const char buffer[] = "010901";

您可以像这样可视化它:

               +-----+-----+-----+-----+-----+-----+-----+
buffer ------> | '0' | '1' | '0' | '9' | '0' | '1' | ' |
               +-----+-----+-----+-----+-----+-----+-----+
                              ^
                              |
                              |
                         buffer + 2

数组类型的表达式经常进行数组到指针的转换。基本上,此处buffer的名称可以转换为指向其第一个元素的指针。在这两种情况下都会发生这种情况。数组将转换为char*,然后printf将其解释为 C 样式字符串中的第一个字符。

在第二种情况下,在转换为指针后,您将向该指针添加 2。这为您提供了指向第三个元素的指针。 printf再次将其视为 C 样式字符串,但从您创建的数组的第 3 个字符开始。

起初我以为你有一个字符串没有以 null 结尾的问题。但是,您的代码没问题,因为数组的大小为 7,最后一个元素将设置为 0,因为您没有为其指定初始值设定项。然而,这是令人困惑的。我建议你改为像这样声明你的数组:

char buffer[] = "010901";

C++定义了隐式数组到指针的转换;也就是说,数组可隐式转换为指向其第一个元素(索引为 0 的元素(的指针。这意味着您的代码基本上是像这样迭代的:

printf("%s", (&buffer[0]) + 2);

兄弟,你需要终止该字符串!

char buffer[7] = {'0', '1', '0', '9', '0', '1', ''};
// It prints 010901
printf("%s", buffer);
// It prints 0901
printf("%s", buffer+2);
char buffer[7] = {'0', '1', '0', '9', '0', '1' , ''};

C 中的数组名称基本上也是指向数组位置的指针

buffer[i]被翻译为*(buffer+i)即将i添加到指针值[遵循指针算术]。因此,它给出了该位置的地址。 printf将打印%s,直到遇到n。因此,输出。

检查此内容以了解指针和数组