添加char数组

时间:2013-04-18 11:56:00

标签: c++ c

这可能是一个愚蠢的问题。玩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个字符?

5 个答案:

答案 0 :(得分:6)

在诸如此类的上下文中,数组名称buffer“降级”为仅指向第一个值的指针。由于C和C ++支持指针运算,并且字符串仅表示为字符数组的指针,因此没问题。

请注意终止'\0'字符,这是因为您指定的大小超过了为初始化数据提供的大小。

但是,您的代码可以简化为:

const char buffer[] = "010901";

你可以像这样形象化它:

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

答案 1 :(得分:1)

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

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

起初我认为你的字符串没有被空终止的问题。但是,您的代码没问题,因为数组的大小为7,最后一个元素将设置为0,因为您没有为它指定初始值设定项。但是,这很令人困惑。我建议你改为声明你的数组:

char buffer[] = "010901";

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

char buffer[7] = {'0', '1', '0', '9', '0', '1' , '\0'};

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

buffer[i]被翻译为*(buffer+i),即将i添加到指针值 [跟随指针算术]。所以,它给出了该位置的地址。 printf会在遇到%s之前打印\n。因此,输出。

检查this以了解指针和数组

答案 4 :(得分:0)

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

char buffer[7] = {'0', '1', '0', '9', '0', '1', '\0'};

// It prints 010901
printf("%s", buffer);

// It prints 0901
printf("%s", buffer+2);