C语言,struct Student s[40],*p=s,这时,结构体数组指针p指向了首元素的地

C语言,struct Student s[40],*p=s,这时,结构体数组指针p指向了首元素的地址,(1)p++指向哪里?
(2)(++p)->age是谁?
(3)(p++)->age是谁?

第1个回答  2016-01-29
1.p++指向s[1],相当于s数组的首地址自增1。
2,s[1]的age成员,相当于先自增到s[1],然后去s[1]的age数据。
3.s[0]的age数据加个1,相当于先指向首地址的age数据,再在age的数值上自增1。
附:++在前,表示先自增后运算。
++在后,表示先运算后自增。
如有疑问,欢迎追问。追问

哦,那p++相当于指向s[1],那要是想指向第0行的某个成员呢?p应该怎样表示?是p->s[0].name?

追答

p指向name就可以了,p开始就已经表现了指向s的首地址s[0]了,所以直接取里面成员就可以了

但在实际应用中是要先声明对象,通过对象.成员来取某个值

追问

还有个疑问哈(2)(++p)->age是指针先向下移动一行,再取里边成员age的值,即比如是20,是么?
(3)(p++)->age是先取第0行的年龄20,再使年龄增1,就是21?

追答

嗯,没错,就是这样子

追问

但书上说的好像不一样诶

挺晕的

追答

哪里不一样?

p++指向age,按书上那么做是对的,假如s[0]的age的值为10,s[1]的age值为20,那么第一次输出的时候就是10,第二次直接输出*p就是20了,因为第一次是先运算,即先输出p指向首地址age的值10,其后p地址自增,然后再输出*p的时候就是s[1]的age值了20

上面说的是p++ ->age

开始是我理解错了,第三问。

追问

对,(p++)->age是先取p->age,10,指针p再自增,指向s[1]

(++p)->age是p先自增,指向s[1],之后再取成员s[1].age 20

追答

就是这个意思,应用到实际中,第一次是先输出s[0]的age10,第二次就会输出s[1]的age20,因为第一次输出后p改变指向到s[1]了

没错,就是这样子理解的

这次绝对没错了,抱歉,刚刚是我的失误

追问

谢谢

追答

主要是现在很少用c了,我学c#去了,c和c++的没怎么用,有点忘了

本回答被提问者采纳
第2个回答  2016-01-29
p的指针是struct Student *类型的,如p指向s[0],那么p++会指向s[1]
cout<<(++p)->age;相当于p++; cout<<p->age;
cout<<(p++)->age;相当于cout<<p->age; p++;
第3个回答  2016-01-29
p++指向元素s[1]
(++p)->age表示s[1]->age
(p++)->age表示s[0]->age
相似回答