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是一个数组。
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是一个数组(不要与指针混淆),并且您不能更改数组的地址。另一方面,类型为c,char *因此您可以对其进行修改。
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更改),但是允许使用第二种形式(指针本身保持不变)。