问一道关于C程结构指针的题~~麻烦计算机大神们帮个忙啊~~

假定有如下定义,
struct st {
char name[10];
int score;
}a[3],*p=a;
请问哪个用法是正确的?
A.p->name="Tom";
B.*p,name[0]='B';
c.(*p)->name[0]='C';
D.*(*p).name='D'
好像概念定义的东西比较多,指针也学的不是很好,望大神们能把每个答案讲解下,帮助理解,感激不尽~~
首先感谢各位亲们的回答~我也觉得是A,不过答案显示D,所以不是很理解,呵呵~~也许是答案错了。。不过真心的指针和二级指针啥的不是很懂。。不好意思,B答案不是逗号,打错了,*p.name[0]='B';

上面的同学别误导了
D是正确的
A项:name是个数组名,即数组的首地址,数组的地址是不能改变的!p->name="Tom"正是企图改变name数组的地址;
B项:.号的优先级比*高,相当于是*(p.name[0])='B',显然是错的;
C项:P是一级指针,*P相当于a[0]了,a[0]->name[0]就错了;
D项:.比*的优先级高,所以D项表达式相当于*((*p).name))='D',又由于*p相当于a[0],所以也就相当于*( a[0].name ) = 'D',同理又相当于是a[0].name[0] = 'D',这是正确的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-06-07
D才是对的
首先说下A,name[10]是数组,除了在对数组初始化时可以赋值外,只能用循环一个一个赋值,或对数组首地址赋值字符串(把字符串的首地址附给数组的首地址),不能一个字符串直接赋给数组,如:char name[10]={1,2,3,4,5,6,7,8,9,10};这是对的;
char name[10];
name[10]={1,2,3,4,5,6,7,8,9,10};是不行的。
所以p->name="Tom";错的
然后说下D,
(*p).name等价于p->name,再加一个*,即*(*p).name就是取p->name这个数组的手地址,即*(*p).name是一个指针。因为C中可以对一个指针进行赋值一个字符串,所以*(*p).name='D'是对。
额。。。我说的不清楚,不过D的确是对
第2个回答  2012-06-07
A正确
B中 * 运算符优先级低于 . 运算符(误打成 , 了?),所以正确引用方法为 (*p).name[0]='B'
C中 -> 运算符前面必须是指针,而 (*p) 代表变量 a[0]
D中有两个错误,首先明显是赋值概念不清,声明指针同时赋初值格式为 *p=&i ,而声明之后再赋初值格式则为 p=&i;此处明显是将题目中当成第二种情况了,所以将 *p 当成了地址而非变量;第二,name为char数组,整体赋值必须以字符串的形式赋值,单字符赋值则必须加下标,表明赋值给元素
===========================================
唉,自己说的 “ * 运算符优先级低于 . 运算符 ” 自己不记得,
D是对的,*(*p).name 是 *((*p).name)而非(*(*p)).name;
因为name是常量指针,用*可取到该地址数据,而取到的正是char数组元素name[0],进行赋值没错。
而A则错在:在C语言中不可对数组整体赋值,除非是在声明时就初始化。
第3个回答  2012-06-07
我来给你好好解释一下吧,兄弟
struct st{
char name[10];
int score;
}a[3],*p=a;
这个部分表示的是定义一个结构体st,并且声明了一个包含3个st元素的数组a,另外定义一个结构体指针p指向了数组a的首地址。
A.p->name="Tom";
这个选项中我们分析:p是指向数组a首地址的指针,那么p->name实质表示了a[0]当中的name[10]数组的首地址,那么将"Tom"赋给一个指向字符串数组的首地址是合法的,所以正确。
B.*p.name[0]='B';
分析由于运算“.”的优先级高,所以这个表达式其实是*(p.name[0])=‘B',所以不对呀。
C.(*p)->name[0]='C';
这个选项中注意(*p)表示的是a[0],他是一个变量而不是一个指针,所以的话不能用->这个符号,错误。
D.*(*p).name='D';
这个错很明显,(*p)已经表示一个结构体变量了,再加个*号不伦不类了。
第4个回答  2012-06-07
A是对的
p->name="Tom";指的是a[0].name="Tom"
*p,name[0]='B';逗号不对,他想表达的应该是(*p).name[0]='B',即a[0].name[0]='B'
(*p)->name[0]='C';不能用箭头,要写成(*p).name[0]='C';即即a[0].name[0]='C'
*(*p).name='D',.多了一个*号,*p已经是a[0]的意思了,没必要再加一个*
我是这样理解的,你可以参考一下
相似回答