读书人

为什么相同的结构体指针增量操作在不同

发布时间: 2013-10-06 18:25:14 作者: rapoo

为什么相同的结构体指针增量操作在不同代码有的编译正常,有的出现错误?
1.
#include <stdio.h>

int main()
{
struct student{
char * name;
int score;
};

struct student st={"Brian",97};
struct student *ptr=&st;


printf("ptr->name=%s\n",ptr->name);
printf("*ptr->name=%c\n",*ptr->name);
printf("*ptr->name++=%c\n",*ptr->name++);
printf("*ptr->name=%c\n",*ptr->name);
/*
printf("ptr->score=%d\n",ptr->score);
printf("ptr->score++=%d\n",ptr->score++);
printf("ptr->score=%d\n",ptr->score);
*/
return 0;
}


2.
#include <stdio.h>

int main()
{
struct student{
char name[89];
int score;
};

struct student st={"hello",79};
struct student *p;
p=&st;

printf("p->name=%s\n",p->name);
printf("*p->name=%c\n",*p->name);
printf("*p->name++=%c\n",*p->name++);

return 0;
}

两个程序,但是红色标注的那一行的代码在第一个程序中正常,但是在第二个代码中就显示错误:error: lvalue required as increment operand(错误:左值需要增量操作数),为什么这样子的呢,我看到这两个代码都一样呀,除了结构体赋值不同,但是为什么第二个会出现错误呢?
[解决办法]
楼主第二个程序中的红色语句不合法是可以肯定的,p->name对应的是一个地址常量,不能认为是左值,固然不可以作为++的操作数了。。。
[解决办法]
第二个程序中,p->name 是数组名 你认为可以++吗??

数组名,虽然也能当指针使用,但是这个指针是个指针常量,不可变的;
++需要左值,所以错了。

另外,第一个程序,虽然编译和运行没有错误。
不过这种用法,是有问题的。
不管,这个指针是否左值,这个指针实际意义是,指向一个字符串,这个字符串,是一个名字。

做了++以后,他就不能指向,完整的字符串了。
如果其他地方,也用到这个指针,那么你只能得到这个名字的一部分,

那么程序就出错了。
这个程序就不正确了。

这种程序逻辑错误,最麻烦了。

PS:
如果只是研究一下,这么做没什么。

如果是在项目中,千万不能这么做。

读书人网 >C语言

热点推荐