C语言题,求解释
的有关信息介绍如下:
int aaa(char *s) {char *t=s; while(*t++); t--; return(t-s); }为什么是求字符串s的长度呢?1.这个你可以分析出来穿来的可定是字符串。然后while(*t++)赋空语句;表示循环到*t=\n位置;然后t--;移到前面的位置,就是abcd的d位置那d和第一个字符a来做比较大小。t与s两个指针只能做一个字符的指向然后通过++或者--来往后一个字母或是前一个字母这题主要目的他是把第一个字母和最后个字母来做比较2.若有定义语句:int a[2][3],*p[3];则为什么p[0]=&a[1][2];2.首先&a[1][2]这个是地址吧,那你意思就是p【0】为什么是地址对吧。*p[3]是个二维指针。也可以转换为二维数组表现方法有很多。p[0]是0行0列的首地址,写全应该是p[0]+0,p[0]+1.。。。这样3.#includevoid fun(int *a,int n)/*fun函数的功能是将a所指数组元素从大到小排序*/{int t,i,j;for(i=0;i=’0’) {n=10*n+*s-’0’;s++;}第一个6符合条件。然后10*0+6指向下个。然后是1进去符合条件。n此时已经等于6了10*6+1=61吧。然后*进去不符合条件。立即将61用return返回!5.有以下程序:#include void fun(char *t,char *s){while(*t!=0)t++;while((*t++=*s++)!=0);}main(){char ss[10]=”acc”,aa[10]=”bbxxyy”;fun(ss,aa);printf(“%s,%s\n”,ss,aa);}程序运行结果是accbbxxyy,bbxxyy5.有以下程序:#include void fun(char *t,char *s){while(*t!=0)t++;while((*t++=*s++)!=0);}main(){char ss[10]=”acc”,aa[10]=”bbxxyy”;fun(ss,aa);printf(“%s,%s\n”,ss,aa);}程序运行结果是accbbxxyy,bbxxyy5.while((*t++=*s++)!=0);这个其实是赋值语句呀。ss=“acc”,aa=“bbxxyy”先while(*t!=0)t++;循环到acc\0最后字符的时候*t++=*s++然后这样*t=*s然后++一直到*s==0的时候,*t不是等于acc连接了*s里面的字符“bbxxyy”然后返回来给ss,aa没变呀输出的是accbbxxyy,bbxxyy6.#include #include void fun(char s[][10],int n){char t;int i,j;for(i=0;is[j][0]{t=s[0];s[0]=s[j][0];s[j][0]=t;}}main(){char ss[5][10]={“bcc”,”bbcc”,”xy”,”aaaacc””aabcc”}fun(ss,5); printf(“%s,%s\n”,ss[0],ss[4]);}为什么是aaaacc,xy 6.这题他注释已经告诉你为什么答案是这个了。首先我们不看其他函数,没有预处理文件,我们按规程办事,看main()方法一直到fun(ss,5)这里将5个字符串和5附到fun形参里并已经开始调用了,然后看fun函数接受过来以后for(i=0;is[j][0]{t=s[0];s[0]=s[j][0];s[j][0]=t;}如果前面的比后面的大,相互互换,那前面肯定到最后是最小咯。那后面我也不看了。你就看他最小的字符串是多少。按ASKII来比,又都是小写的,较头字母a最小吧。那只有aaaacc和aabcc吧。那第三个字母一个是a一个事b哪个最小不是出来了吗。在看最大的。x头字母没有比他大的了,所肯定是x带头的字符串是最大的。所以要求输出a[0]最小是aaaacc,a[4]是最上标也就是最大不就是xy吗?7.有以下程序#include int a=1;int f(int c){static int a=2;c=c+1;return (a++)+c;}main(){ int i,k=0;for(i=0;i<2;i++){int a=3;k+=f(a);}k+=a;printf(“%d\n”,k);}程序运行结果是147.这题有点陷阱了,先是3到f函数定义了个static int a=2;就是说第一次调用好以后a=a++吗,返回的是3+1+2=6第二次调用的时候a!=2了而是3返回的是3+1+3=7然后k=6+7=13然后k+a=13+3=16. 这题目有点不对。首先在main()函数里面没有定义过a,而你在for循环a=3就会出现异常。即使定义了,最后结果也不是14.8.有以下程序#include void fun(int n,int *p){ int f1,f2;if(n==1||n==2) *p=1;else{ fun(n-1,&f1); fun(n-2,&f2);*p=f1+f2;}}main(){ int s;fun(3,&s); printf("%d\n",s);}程序的运行结果是28.首先是将3和没有值的s地址赋给fun函数里的形参3!=1!=2所以执行else语句里面有递归fun(n-1,&f1)先再调用此,可是第一次调用还没有结束,先挂在这边都结束了再来。n-1=3-1=2就符合if语句了*p=1=f1.也就是说f1=1然后后面的调用结束,在来看没有完成的第一调用的地方。结束了一个递归,又来了,第二波不要被他吓到,(一波未平一波又起,但是最后还是死在沙滩上)进去第二次循环此时n=3不是n=2因为n=2是第二次的循环,还这里还是3.所以3-2=1和f2的地址再调用同样符合条件*p=1=f2 f2也等于1 ,最后*p=1+1=2返回给最初的调用s的地址上所有s=29.有以下程序#includestruct tt {int x;struct tt *y;} *p;struct tt a[4]={20,a+1,15,a+2,30,a+3,17,a};main(){ int i;p=a;for(i=1;i<=2;i++) {printf("%d,",p->x); p=p->y;}}程序的运行结果是20,159.struct tt {int x;struct tt *y;} *p; /*定义结构体吧。成员变量为int x 和 tt *y类型的指针相当于*next为了指向下一个的*/struct tt a[4]={20,a+1,15,a+2,30,a+3,17,a};在函数体外,就是全局变量咯p=a; /*p指向a也就是说p是头指针*/for(i=1;i<=2;i++) {printf("%d,",p->x); p=p->y;}/*循环2次,都输出p.y也即是p的下一个指向*/我画个图应该可以理解了|---------| |---------| |---------| |---------| |---------| | p | ====== | a[0] | -----> | a[1] | -----> | a[2] | ----> | a[3] | |---------| |---------| |---------| |---------| |---------| 这就是这个图形p和a[0]是一个地址其他4个a[0]-a[3]都是有int x;struct tt *y;的struct tt *y表示图上的----》指向下个位置x为里面的值第一次循环p.x也就是a[0].x是首地址吧20然后p=p->y;y就是a+1就是----》知道a[1]了然后第二次循环输出a[1].x=15吧。所以最后答案就是20,1510.有以下程序#include #include typedef struct{ char name[9];char sex; float score[2]; } STU;STU f(STU a){ STU b={"Zhao",'m',85.0,90.0}; int i;strcpy(a.name,b.name);a. sex=b.sex;for(i=0;i<2;i++) a.score=b.score;return a;}main(){STU c={"Qian",'f',95.0,92.0},d;d=f(c); printf("%s,%c,%2.0f,%2.0f\n",d.name,d.sex,d.score[0],d.score[1]);}程序的运行结果是Zhao,m,85,90 10.这个就是简单利用拷贝关系,先定义了结构体STU类型,然后在main函数里定义了STU c={"Qian",'f',95.0,92.0},d;变量并赋值了,这个我们叫初始化。然后放到f()函数里的形参去也就是STU a然f()方法里面也定义了STU b={"Zhao",'m',85.0,90.0};变量并赋值strcpy(a.name,b.name);这个事字符串里的拷贝把b里面的name全部覆盖掉a里面的name并拷贝。a.name这时候是zhao和b是一样的了。a.sex=b.sex将b的性别赋给a的性别,也就是改掉原来的值了。a和b现在一样了,最后循环两次,a.score=b.score;一样将成绩也改成b的了。所以现在a不是原来的a了,而是b的数据了。11。有以下程序#include main(){ int a=1,b=2,c=3,x;x=(a^b)&c printf("%d\n",x);}程序的运行结果是311.这个是位于运算符,^和&异或然后与得运算先将1,2,3转换成2进制1=00000001,2=00000010,3=00000011异或是有一个1(真)就是1(真),00000001^00000010=00000011而00000011&00000011是与运算遇到都是1(真)才是真否则都是0(假)那么那个都是一样的地方有1所以答案还是原来的00000011再转换成10进制1+2的1次方=312有以下程序#include main(){FILE *fp; int a[10]={1,2,3,0,0},i;fp=fopen("d2.dat,"wb");fwrite(a,sizeof(int),5,fp);fwrite(a,sizeof(int),5,fp);fclose(fp);fp=fopen("d2.dat","rb");fread(a,sizeof(int),10,fp);fclose(fp);for(i=0;i<10;i++) printf("%d",a);}为什么是:1,2,3,0,0,1,2,3,0,0, 12.这题是关系到文件fwrite(a,size(int),5,fp)函数是将a里面的数据1,2,3,0,0写到fp指向的d2。dat中去然后又出现了一遍fwrite(a,size(int),5,fp)照前面在执行此,就是在12300后面再写一遍12300所以最后,用fread(a,sizeof(int),5,fp)将fp的东西放到a里面去也就是是拷贝了。所以1230012300啊这个都是基础的问题。不过很烦,希望你努力分析,不管什么,考试还好,还是分析程序还好,看有没有预处理的。就先看预处理的。然后看有没有全局变量或者结构体的,没有就看main()函数,这个就是不变的步骤,没有其他的变数。