[C语言] 字符数组可以++吗?

[复制链接]
3360|23
 楼主| yanghelovehuang 发表于 2018-7-23 18:01 | 显示全部楼层 |阅读模式
有个cahr型数组 char a[] = “fsdfa”。        printf("a = %c\n", *a);
       a++;
       printf("a = %c\n", *a);

编译提示:错误: 自增操作数必须是左值
这是怎么回事?


tanek 发表于 2018-7-23 18:12 | 显示全部楼层
    char a[] = "aaaa";
    char *b;
    b = a+1;

如果这样就可以。 b是指针变量。
airwill 发表于 2018-7-23 19:28 | 显示全部楼层
这里的
a++  
也不好理解, 你在增量什么
是数组的地址, 还是数组里各一个的数值, 或是某一个数值?
iDiy 发表于 2018-7-23 19:37 | 显示全部楼层
a是常量
caoenq 发表于 2018-7-23 21:03 来自手机 | 显示全部楼层
地板正解
linqing171 发表于 2018-7-23 21:13 | 显示全部楼层
数组名不能作为++运算的左值。
知识11 发表于 2018-7-23 21:20 | 显示全部楼层
有个cahr型数组 char a[] = “fsdfa”。  
char *b;
b=a;      
       b++;
       printf("a = %c\n", *a);
eydj2008 发表于 2018-7-24 08:12 | 显示全部楼层
这个问题 改编译器就可以了 ,你适合更高级的语言.
C的效率高 但是规则不少.  汇编的效率更高,规则更多.

这里的a 表示一个地址 ,但不是变量,好吧   (我知道你的理解:你就是定义的一个数组 全都是变量,你想说怎么不能++, 因为a == &a[0], 是等效的, 他就是一个RAM地址)
 楼主| yanghelovehuang 发表于 2018-7-24 09:40 | 显示全部楼层
airwill 发表于 2018-7-23 19:28
这里的
a++  
也不好理解, 你在增量什么

当然是地址了,a是数组首地址,a++当然数地址++了, 数组中一个元素占一个字节,理论上地址加一再获取该地址上的数值就是下一个元素,不是吗
 楼主| yanghelovehuang 发表于 2018-7-24 09:45 | 显示全部楼层
eydj2008 发表于 2018-7-24 08:12
这个问题 改编译器就可以了 ,你适合更高级的语言.
C的效率高 但是规则不少.  汇编的效率更高,规则更多.

就是说不是变量不能++吗?数组不是在连续的地址上存储的吗?既然a首地址代表的是a【0】的地址,a[0], a[1]的地址又相差一,所以a的地址加上一不就是a[1]的地址了吗?

评论

这是规则,就像语言中的语法一样,不能完全用逻辑来解释。  发表于 2018-7-26 14:57
 楼主| yanghelovehuang 发表于 2018-7-24 09:45 | 显示全部楼层
linqing171 发表于 2018-7-23 21:13
数组名不能作为++运算的左值。

那++a呢
 楼主| yanghelovehuang 发表于 2018-7-24 10:04 | 显示全部楼层
linqing171 发表于 2018-7-23 21:13
数组名不能作为++运算的左值。

那把数组以指针参数的形式传递给函数,是不是就能++了, 比如int  fsf(char *a)
airwill 发表于 2018-7-24 10:09 | 显示全部楼层
yanghelovehuang 发表于 2018-7-24 09:40
当然是地址了,a是数组首地址,a++当然数地址++了, 数组中一个元素占一个字节,理论上地址加一再获取该 ...

但是编译器不知道啊
如果地址增加, 是让编译器给数组安排的地址进行改变吗?  因为 a 是数组首地址的指针啊, 不管你怎么++, a 都是数组首地址哪.
这涉及数据移动了.
 楼主| yanghelovehuang 发表于 2018-7-24 10:23 | 显示全部楼层
airwill 发表于 2018-7-24 10:09
但是编译器不知道啊
如果地址增加, 是让编译器给数组安排的地址进行改变吗?  因为 a 是数组首地址的指针 ...

嗯嗯 谢谢您的回答,明白了,那把数组作为参数传给函数是不是就能++了,比如int  fsf(char *a。
linqing171 发表于 2018-7-24 12:23 | 显示全部楼层
yanghelovehuang 发表于 2018-7-24 10:04
那把数组以指针参数的形式传递给函数,是不是就能++了, 比如int  fsf(char *a) ...

int fsf(char*abcd)
{
abcd++;
}
是没有问题的。因为把数组的首地址这个常量 赋给了 一个指针变量。
李不走寻常路 发表于 2018-7-24 12:51 | 显示全部楼层
这里的a是数组的首地址(注意首地址是常量),而++(自增运算符)是针对变量的,所以你的程序中的a++会出错。以前我也遇到多你这个问题。
雪山飞狐D 发表于 2018-7-24 13:35 | 显示全部楼层
本帖最后由 雪山飞狐D 于 2018-7-24 13:39 编辑

  指针 *P++就行,一般也是这么用的,初始化为指针字符串    char * P="abcdefg" ;
 楼主| yanghelovehuang 发表于 2018-7-24 16:12 | 显示全部楼层
雪山飞狐D 发表于 2018-7-24 13:35
指针 *P++就行,一般也是这么用的,初始化为指针字符串    char * P="abcdefg" ;  ...

谢谢各位大神啊 谢谢
小小电子爱好者 发表于 2018-7-24 20:42 | 显示全部楼层
大家都好热心!刚看到帖子都这么多解答!轮不到我说了
caijie001 发表于 2018-7-24 20:46 | 显示全部楼层
这是一个常量字符串啊,定义在什么区我忘了,是不可以++的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

324

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部