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编译器下顺利通过,其他也都没问题呀

C语言3道选择题。每道题要说明理由。我做错的,但不知道原因。谢谢
第二题: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)就是最后一...

C语言选择题(3道题),帮忙解答一下,谢谢!
b=b-a=10-1=9,a=2,再判断条件:b--<0 b=9>0 然后b-- (注意无论判断条件是否满足,都执行),b=8 第二题:答案错了,应选D 程序应该这么看:int a=3,b=2,c=1;int x=10,y=20;if(ab就不满足条件,所以下面的不执行!if(b!=0)if(!x) y=1;else if(x) y=0;y=-1...

问几个C语言的问题,请说下选择的原因,谢谢!
2. 选B了,求余数,两边肯定要是整数了,否者小数怎么求余数啊。char型也是一个整数了 3. 选A了,形参与实参之间传递的方式,是将实参的值复制一份给形参。使用的是两个不同的存储单元。故调用函数时,对形参做的一切修改都不影响实参。4. 3,,这个根据循环条件一步一步算,反正循环变量少...

c语言的题目,不知道原因。
1. B A.float add(int x,y) \/\/int x,y应为int x,int y B.int add(int x,int y) \/\/对 C.char add( ) \/\/函数原意是相加,但无参数,则函数只能返回固定字符,无参数时且最好为char add( void )D.int add(char [ ] [ ]) \/\/函数参数是...

C语言问题,求大神解决,谢谢啦,我是小白,最好能够解释下原因...
第一项的结果不正确。第二项和第四项结果等同都是指向指针的指针操作。可以将二维数组看成一个双重指针,第一个中括号是一个一重指针。比如说a[n][m]中a[0]是一个指向a[0][m]数组首位a[0][0]的指针,而a则是指向指针数组*a[n]的首位a[0]的指针。这样我们来看B选项,*(a+2)表示一...

C语言问题,求大神解决,谢谢拉。。我是小白,解释下原因
主要考察你c语言三目运算符的结合方向 是自右向左的 所以a<b?a:c<d?c:d 可以看成 a<b?a: (c<d?c:d) 1 < 4 ? a : (c < d ? c:d)括号内的表达式也可以看做是一个元素 因为 a = 1 b = 4 所以 条件 a < b 成立 所以选前者 a 答案就是 A) 1 ...

C语言题目,详细解释,每一项为什么,谢谢
这个题目选C。因为定义a[3][4]二维数组后,第一下标的取值范围是0~2三个数,第二下标的取值范围是0~3四个数,即:a[0~2][0~3],共计3×4=12个元素。显然选项C的a[0][4]并不在这个范围内,所以这个元素并不存在,是非法调用。

C语言高手帮忙做这三道题,要详解 谢谢拉!!
x"的值为0时。所以就是x==0.2、C 这题和上题一样,就是(m)表达式为真时,执行a++;为假时,执行a-。表达式m的真假与表达式m!=0一样,所以选C。3、C define是宏定义,这里的效果就是把s(m,n)替换成m\/n,所以s(4+2,2+1)进行替换后就成了4+2\/2+1=4+1+1=6。所以选C ...

几道C语言选择题,要详细过程,本人基础不好,额外加点儿进制解说,谢谢...
1.B 因为以0开头的数是八进制数,而八进制数的数字是0~7,没有8的 C是科学计数法,是可以作为常量的,所以也是正确的 2.B 因为按%d输出,即十进制输出,所以要转换成十进制 x是八进制的23,转换成十进制为2*8+3=19,因为是前置运算符--,先做-1运算再输出,所以为18 3.B i同上,前置++为先...

C语言编程题目三道
include<stdio.h>void cal(int n1,int n2,char f);int main(){ int n1,n2; char f; printf("分别输入两个小于100整数及一个运算符号:\\n"); scanf("%d%d",&n1,&n2); getchar(); scanf("%c",&f); cal(n1,n2,f); return 0;}void cal(int n1,int ...

相似回答