问几道C语言的问题

1)有以下程序
main()
{int x[3][2]={0},I;
for(I=0;I<3;I++) scanf("%d",x[i]);
printf("%3d%3d%3d\n",x[0][0],x[0][1],x[1][0]);
}
若运行时输入:2 4 6<回车>,则输出结果为
A)2 0 0 B)2 0 4 C)2 4 0 D)2 4 6

2)有以下程序
main()
{char s[]={"aeiou"},*ps;
ps=s; printf("%c\n",*ps+4);
}
程序运行后的输出结果是
A)a B)e C)u D)元素s[4]的地址

3)以下语句中存在语法错误的是
A)char ss[6][20]; ss[1]="right?";
B)char ss[][20]={"right?"};
C)char *ss[6]; ss[1]="right?";
D)char *ss[]={"right?"};

4)若有定义:char *x="abcdefghi";,以下选项中正确运用了strcpy函数的是
A)char y[10];strcpy(y,x[4]);
B)char y[10];strcpy(++y,&x[1]);
C)char y[10],*s;strcpy(s=y+5,x);
D)char y[10],*s;strcpy(s=y+1,x+1);

5)有以下程序
#include <stdio.h>
#define N 5
#define M N+1
#define f(x) (x*M)
main()
{int i1,i2;
i1=f(2);
i2=f(1+1);
printf("%d %d\n",i1,i2);
}
程序的运行结果是
A)12 12 B)11 7 C)11 11 D)12 7

请给出详细的解答过程,无言感激!

1 B。
多维数组按顺序赋值时如有剩余以零补足,多维数组的行号可以代表改行第一个元素的地址,即
scanf("%d",x[i]); 相当于
scanf("%d",&x[i][0]);
输入2 4 6后x[0][0],x[1][0],x[2][0]的值分别是2,4,6,其余均为0。

2 B。
ps=s;即将指针ps指向字符数组s的首元素,*ps是a,+4后即e。

3 A。
A 这种用法是不允许的;
B 多维数组可以不指定第一维的个数;
C ss是一个指向字符型的指针数组,ss[1]="right?"; 将其第二个元素指向字符串"right"的首字符r。
D 同样是指向字符型的指针数组,第一维数可以不定。

4 D
A 注意:当x是指针时x[i]相当于*(x+i),x[4]也就是e,数据类型是char,而strcpy函数的第二形参是字符数组中指向字符型的指针,即*char。
B y可以代表字符数组y第一个元素的指针,但不能像通常的指针一样进行++操作。
C 赋值运算也有结果,经赋值运算后,赋值表达式具有赋值后赋值运算符左边变量同样的类型和值,s=y+5的结果即y指向中的第6个元素,但此时y已经放不下x指向的字符串常量,故不能算“正确运用”。
D 正确。

这些乱七八糟的东西大概真的只有在考试时才会出现……

5 B。
注意:宏定义只是在编译之前做简单的字符替换工作,为保证带参数的宏定义替换后的完整性,一般要加括号,例如本题中应写为
#define f(x) ((x)*m)
不加的话有三种可能:
1 有把握不会影响程序功能
2 忘了
3 正在出考试题目
这里替换后的结果为:
i1=f(2)=2*5+1=11 (注意:不是2*6!为处理嵌套的宏定义,编译系统采用多次扫描替换的处理方法,但若新产生的字符序列又出现已被替换过的宏名则不再替换)
同样地,i2=f(1+1)=1+1*5+1=7。

***结束***
温馨提示:答案为网友推荐,仅供参考
相似回答