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

har*_*s08 2 c c++ arrays pointers string-literals

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

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

#include <iostream> 
using namespace std;

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

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

    cout<<c<<endl<<d;
} 
Run Code Online (Sandbox Code Playgroud)

我收到以下错误,

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

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

编辑: 现在我对这两个语句之间的区别有点困惑:

*(d++)
Run Code Online (Sandbox Code Playgroud)

*(d+1)
Run Code Online (Sandbox Code Playgroud)

假设d是一个数组。

Moh*_*ain 5

char d[6];
while(*d++ = *c++);
Run Code Online (Sandbox Code Playgroud)

应该重写为:

char d[6];
int idx = 0;
while(d[idx++] = *c++);
Run Code Online (Sandbox Code Playgroud)

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

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

d++; // Not allowed
d = c; // Not allowed
Run Code Online (Sandbox Code Playgroud)

关于您添加的问题:

*(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)
Run Code Online (Sandbox Code Playgroud)

同样,在编写时*(d++),您尝试访问(通过取消引用)当前位置,然后将指针本身增加到下一个位置。但是在编写时*(d + 1),您正在访问下一个位置,指针本身保持不变

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

  • 或`char * pd =&d [0]; while(* pd ++ = * c ++);`-您可以使用两个指针。 (3认同)