字符数组上的加法
Addition on array of char
这可能是一个愚蠢的问题。玩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
。因此,输出。
检查此内容以了解指针和数组
- 指向指向字符数组的指针数组的指针
- 比较字符数组
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- 使用无符号字符数组有效存储内存
- 按字符值访问int数组
- 错误:字符数组的初始值设定项太多
- 对字符数组中的元素执行逐位操作
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- C++ 无法在字符数组中使用 for 循环打印字母模式
- 如何在 C++ 中从文件中读取字符数组(带有一些空格)
- 移动二维数组中的字符
- C++ 传递二维字符数组
- 无法在 C++ 中输入字符数组
- C++ 带结构的数组字符
- 数组字符包含量超出预期
- 读取文件并添加到数组字符
- 如何在Qt中更改或替换数组字符
- 为什么编译器不在参数中传递数组字符 *arr[] 的大小?
- 井字棋数组字符错误
- 分割数组字符