错误:无法增加'char [6]'类型的值

时间:2015-03-30 06:47:17

标签: c++ c arrays pointers string-literals

我正在尝试用C / C ++学习指针和字符串文字。 根据我的理解,字符串文字是char数组,最后是\0。我们基本上可以对数组进行所有指针算术运算,如递增和递减。

但是当我尝试运行以下代码时:

#include <iostream> 
using namespace std;

int main (){
    char *c ="Hello";
    char d[6];

    while(*d++ = *c++);

    cout<<c<<endl<<d;
} 

我收到以下错误,

error: cannot increment value of type 'char [6]'
    while(*d++ = *c++);

我对此代码的假设是,string literal c的值将被复制到char array d

修改 现在我对这两个陈述之间的区别感到有点困惑:

*(d++)

*(d+1)

假设d是一个数组。

2 个答案:

答案 0 :(得分:4)

char d[6];
while(*d++ = *c++);

应该重写为:

char d[6];
int idx = 0;
while(d[idx++] = *c++);

因为在char d[6];中,d是一个数组(不要与指针混淆),并且您无法更改数组的地址。另一方面,c的类型为char *,因此您可以对其进行修改。

c++; // OK
c = &d[0]; // OK

d++; // Not allowed
d = c; // Not allowed

关于您添加的问题:

  

区别:*(d ++)和*(d + 1)

请考虑以下示例:

int index1 = 42, index2 = 42;
int j = index1++; // j = 42 and index1 = 43
int k = (index2 + 1); // k = 43 and index2 = 42 (unchanged)

类似地,当您编写*(d++)时,您尝试访问(通过解除引用)当前位置,然后将指针本身增加到下一个位置。但是当你写*(d + 1)时,你正在访问下一个位置,指针本身仍然不变

如果d指针是常量或者是数组的第一种形式(其中d被更改)是不允许的,但是第二种形式(指针本身保持不变)是允许的。

答案 1 :(得分:1)

  

数组名称不能是可修改的左值

所以

d++

可以写成

d = d+1;

所以有一个错误应该修复为

while(d[index++] = *c++);