我正在尝试用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
是一个数组。
答案 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++);