C语言3道选择题。每道题要说明理由。我做错的,但不知道原因。谢谢

1、以下语句或语句组中,不正确的操作是__________。
(A)char t[50];scanf(“%s”,t); (B)char t[]=”English”;
(C)char *p;gets(p); (D)char *p;p=”English”;
2、若有以下定义:
chars[10]=”Computer”,*ps=s;
则不能代表字符m的表达式是__________。
(A)ps+2 (B)ps[2] (C)s[2] (D)ps+=2,*ps
3、对int a[3][3],*p=&a[0][0]; 下列写法中有__________种能正确取到a[2][1]的值
(1)p[7] (2)*(a[1]+4) (3)*(a+2)[1]
(A)0 (B)1 (C)2 (D)3
答案是D、A、C

第一题:规则规定不能给char *型指针赋值一个字符串常量,char *型指针只可以用一个字符串“初始化”。即char *p="English"正确,而char *p;p="English";不正确,前者是初始化,后者是赋值。
第二题:ps+2是指针,不是取值;若是*(ps+2)就取到m了。
第三题:一共9个元素,顺序从0排到8,a[2][1]就是第7个(注意从0开始数)元素。所以,p[7]显然是对的;*(a[1]+4)是把a[1]当指针,+4后刚好指向这个数,用*取出来没有错;看一下*(a+2)[1],本来
(a+2)就是最后一行的指针,后面加上[1]就取到这个数了,可是(a+2)前多了个*,但*的优先级比[]低,所以*(a+2)[1]是把a[2][1]这个元素值当指针取它指向的值了,错了。最后答案是2个能取到这个元素,所以C正确。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-03-16
1> p中存的是地址 *p表示地址对应的值 "English”是字符串常量所以不能这么表达

2> ps+2表示m字符的地址不是值 *(ps+2)就对了

3>数组分配的内存空间是在栈中的,空间分配连续。a[3][3] = (a[0][0]~a[2][2])一共九个值
a[2][1]在第八个。

(1)p的首地址0-7正好对
(2)a[1][0]的首地址+4个地址取值也对了
(3)三题表示a[3]首地址的值(把数组扩充后验证下就知道了
*(a+2)[1]输出的是值
* *(a+2)[1]报错
(a+2)[1]输出的是地址
第2个回答  2013-03-16
第一题:
我认为C选项才是“不正确的操作”。因为它只声明了一个指针变量,首先,它没有赋初值,所以这个指针变量指向哪里是不确定的。即使赋了初值也不行,因为gets函数会读入一个字符串,而p指向的只有一个内存单元,根本放不下一个字符串数组。正确做法是像选项A那样,把p声明为一个char数组。

第二题:
ps+2得到的只是一个地址值,对这个地址取值(*(ps+2))才会得到字符m。

第三题:
p[7]可以取到a[2][1]。因为p是int*类型的,而二维数组的元素是在内存中是连续而且是线性排列的,所以从p所指向的a[0][0](数组第一个元素)向后移7个位置恰好就是a[2][1](数组第八个元素)。
*(a[1]+4)可以取到。因为a[1]就是第二行第一个元素的指针(也即是第四个元素),把它加4之后就是指向数组的第八个元素a[2][1]。
*(a+2)[1]不能取到。因为这个式子可以转化成这样*(*(a+2+1))即*(a[3]),a[3]已经越界。
第3个回答  2013-03-16
第一题的D选项在gcc编译器下顺利通过,其他也都没问题呀