C语言题,求解释

为什么是求字符串s的长度呢?
int aaa(char *s)
{char *t=s;
while(*t++);
t--;
return(t-s);
}

2.若有定义语句:int a[2][3],*p[3];则为什么p[0]=&a[1][2];

3.#include
void fun(int *a,int n)/*fun函数的功能是将a所指数组元素从大到小排序*/
{int t,i,j;
for(i=0;i<N-1;I++)
for(j=i+1;j<N;J++)
if (a(a[i]<a[j]) {t=a[i];a[i]=a[j];a[j]=t;}
main()
{int c[10]={1,2,3,4,5,6,7,8,9,0},i;
fun(c+4,6);
for (i=0;i<10;i++) printf("%d,",c);
printf("\n");
}

结果是:1,2,3,4,9,8,7,6,5,0,

4.
#include
int fun(char s[])
{int n=0;
while(*s<=’9’&&*s>=’0’) {n=10*n+*s-’0’;s++;}
return(n);
}
main()
{char s[10]={’6’,’1’,’*’,’4’,’*’,’9’,’*’,’0’,’*’};
printf("%d\n",fun(s));
}

为什么是61?

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,bbxxyy

6.#include <stdio.h>
#include <string.h>
void fun(char s[][10],int n)
{
char t;int i,j;
for(i=0;i<N-1;I++)
for(j=i+1,j<N;J++)
/*比较字符串的首字符大小,并交换字符串的首字符 */
if(s[0])>s[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

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);
}
程序运行结果是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);
}
程序的运行结果是2

9.有以下程序
#include
struct 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,15

10.有以下程序
#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

11。
有以下程序
#include
main()
{ int a=1,b=2,c=3,x;
x=(a^b)&c; printf("%d\n",x);
}
程序的运行结果是3

12有以下程序
#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,

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.#include
void fun(int *a,int n)/*fun函数的功能是将a所指数组元素从大到小排序*/
{int t,i,j;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if ((a[i]<a[j]) {t=a[i];a[i]=a[j];a[j]=t;}
main()
{int c[10]={1,2,3,4,5,6,7,8,9,0},i;
fun(c+4,6);
for (i=0;i<10;i++) printf("%d,",c);
printf("\n");
}

结果是:1,2,3,4,9,8,7,6,5,0,
3.这个答案是对的呀,fun(c+4,6);这个1,2,3,4,5,6,7,8,9,0的a[4]地址转到形参去void fun(int *a,int n)那int *a指向是a[4]=5的地址上for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
n也是传上去的6.就看做是i<6-1;j<6;从5,6,7,8,9,0一共是6个数字没什么不对。然后for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)利用双for语句进行比较邻近的两个如果前面比后面小就,相互换下。也就是从大排到小。
5,6,7,8,9,0进行处理后应该是9,8,7,6,5,0吧。9最大0最小依次下来
。返回到main方法。中加上前面的4个值1,2,3,4并且加上处理过的9,8,7,6,5,0那就变成1,2,3,4,9,8,7,6,5,0吧。

4.
#include
int fun(char s[])
{int n=0;
while(*s<=’9’&&*s>=’0’) {n=10*n+*s-’0’;s++;}
return(n);
}
main()
{char s[10]={’6’,’1’,’*’,’4’,’*’,’9’,’*’,’0’,’*’};
printf("%d\n",fun(s));
}

为什么是61?
4.这个就是说遇到了不是数字就跳出while循环6,1,*所以跳出来用return返回他只读到61
while(*s<=’9’&&*s>=’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,bbxxyy

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,bbxxyy
5.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,bbxxyy

6.#include <stdio.h>
#include <string.h>
void fun(char s[][10],int n)
{
char t;int i,j;
for(i=0;i<N-1;I++)
for(j=i+1,j<N;J++)
/*比较字符串的首字符大小,并交换字符串的首字符 */
if(s[0])>s[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;i<N-1;I++)for(j=i+1,j<N;J++)又是双for进行比较前面的和后面的比大小if(s[0])>s[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);
}
程序运行结果是14
7.这题有点陷阱了,先是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);
}
程序的运行结果是2
8.首先是将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=2

9.有以下程序
#include
struct 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,15
9.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,15

10.有以下程序
#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);
}
程序的运行结果是3
11.这个是位于运算符,^和&异或然后与得运算先将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次方=3

12有以下程序
#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()函数,这个就是不变的步骤,没有其他的变数。
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-12-01
确实你的问题不少啊,第一,二题,楼上那位已经解决了

第三题:if (a(a[i]<a[j])这是什么意思?是if (a[i]<a[j])吧!
明白了a[0]=5解决这个问题就应该不难了

第四题:
第一次执行while循环时,*s='6',执行n=10*n+*s-’0’;s++;后n=6,s指向数组的下一位即*s='1',再次执行while循环,n就等于61啦,*s指向'*',不能满足while循环的条件,结束

第五题:
fun()里的第一个while循环结束时t指向数组的尾部(b的后一位);*t++=*s++的意思可分解为*t=*s(赋值),t++,s++,这条语句使得s数组全体连接到t数组的后面(s数组仍在)

第六题:
if(s[0])>s[j][0]是什么意思

第七题:
注意全局变量,局部变量和static变量的区别
for()第一次循环后k=6;第二次循环时注意f(a)的返回值是7,因为f()函数里的a是static变量,它的值是三了(因为在第一次循环里执行了a++),最后执行k+=a(a是全局变量等于1),所以k=6+7+1

第八题:
注意递归调用
先n=3,执行fun(n-1,&f1)(递归调用fun()),使得f1=1;再执行 fun(n-2,&f2),使得f2=1;

第九题:
注意结构体的内部定义
a[4]是4个结构体元素的数组,a[0]={20,a+1},a[1]={15,a+2},以此类推
先输出p->x是20,再p=p->y=a+1使得p指向a[1],再输出p->x时自然是15

第十题:
函数STU f(STU a)的作用是使得啊等于b,所以d等于b

第十一题:
^是按位或运算符,&是按位与运算符,a^b是0000000000000001^0000000000000010结果是0000000000000011再与c进行&运算结果还是0000000000000011,即十进制3

第十二题:
fwrite(a,sizeof(int),5,fp);是从a数组里取出5个int型的数据写入fp中,两次写入之后,fp中的数据是1,2,3,0,0,1,2,3,0,0;fread(a,sizeof(int),10,fp);是从fp中读10个int型数据写入a中,所以最后的输出是那样的本回答被提问者采纳
第2个回答  2009-09-19
哎,你问的问题也太多了,先给你解两个吧:
第一个:
字符串末尾都有“\0”
while(*t++);执行这一句,如果指针t未指向末尾则继续向后移动,因为后面直接写了一个“;” 所以t不到字符串末尾,执行空语句,而不是执行:t--。
当t到末尾时,退出循环,执行 t--,因为最后的“\0”不计入字符串的长度,所以其值要再减1!
首地址末地址之差就是实际长度。

第二个:
int a[2][3],*p[3];则为什么p[0]=&a[1][2];
p为指针数组,即其里面的元素p[0],p[1]等都代表的是地址,所以对于数组a中的元素a[1][2]要取地址。

关于 用 指针,指针数组,数组指针 访问 一维数组 二维数组 的程序,看下面的几个程序吧:

用指针,指针数组,数组指针 访问一维数组和二维数组,指针的初始化和数组元素的输出容易混淆。分析一下几个小例子:

/*
#include<iostream>
using namespace std;
int main()
{
int a[3] ={0,1,2};
int *p;//int 型指针访问一维数组
p = a;
int i;
for(i=0;i<3;i++)
cout<<*(p)++<<endl;
}
*/

/*
#include<iostream>
using namespace std;
int main()
{
int a[3] ={0,1,2};
int (*p)[3];//用数组指针访问一维数组
p = &a;
int i;
for(i=0;i<3;i++)
cout<<*(*(p)+i)<<endl;//这里使用*((*p)++)输出元素师不正确的
}
*/

#include<stdio.h>
int main()
{
int a[3]={0,1,2};
int *p[1];//用指针数组访问一维数组
p[0] = a;
int i;
for(i=0;i<3;i++)
printf("%d\n",*(*p+i));//或者printf("%d\n",*((*p)++));
}

/*
#include<iostream>
using namespace std;
int main()
{
int a[2][3]={0,1,2,3,4,5};
int *p;//int 指针访问二维数组
for(p =a[0];p<a[0]+6;) // for(i=1,p =a[0];p<a[0]+6;p++,i++) cout<<*p<<endl;
cout<<*p++<<endl;
}
*/

/*
#include<iostream>
using namespace std;
int main()
{
int a[2][3] ={0,1,2,3,4,5};
int (*p)[3];// 数组指针访问二维数组
p = a;
int i,j;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
cout<<*(*(p+i)+j)<<endl;
}
*/
/*#include<iostream>
using namespace std;
int main()
{
int a[2][3]={0,1,2,3,4,5};
int i,j,*p[2];//指针数组访问二维数组
p[0] = a[0];p[1]=a[1];//*p[2] = {a[0],a[1]};
for(i=0;i<2;i++)
for(j=0;j<3;j++)
cout<<*(*(p+i)+j)<<endl;
}*/

其他的自己慢慢分析吧,就那几行,想必不是很困难,学着调试,看看每执行一步各个变量的变化情况~,仔细分析出来,比问别人而学会更好。

愉快~
第3个回答  2009-09-19
蚝油难度

C语言的问题,求解释
int main(){ int a=1;a=a+7; printf("%d\\n",a);return 0;} B.不对,虽然能得到正确答案,但不符合c语言语法。a=7+b+c,a++;应该为a=7+b+c;a++;a=7+b+c与a++是两个语句,应该用分号隔开,而不是用逗号!举例:include<stdio.h> int main(){ int a=1,b=1,c=1...

C语言问题求大神详细解析
a错 因为调用在定义之前但是没有声明 b错 函数定义的时候返回值类型为void,却欲图使用函数的返回值。c错 函数的声明返回值为int,定义返回值为void 不相符 d正确

...帮忙解答,追加悬赏喔。麻烦把各个选项都解释解释最好了:)_百度知 ...
这个union是表示,一块储存空间用short,long,char,三种类型来描述,所以c[0] 与i[0]一样的。这个程序是要打印s->c[0],printf("%x\\n", s ->c[0])这句里的%x表示打印的数字是十六进制的。由于c[0]里面放的是0x39,所以这里打印的正好是39.第三题:与第二题类似,注意这里求的是them的...

c语言 求解释~~
ghimno hino 首先你定义了一个static类型的结构体变量s1 并对里面的数组c赋值为abc 指针s指向了def这个字符串 然后你又定义了一个static类型的结构体变量s2 并使得指针cp指向了字符串“ghi” 。ss1.c数据赋值为jki 。ss1.s指向了“mno”字符串。最后是print(引用下面那个哥们的):第一个printf输...

C语言问题 题目见下面 求解释
[]符号代表取偏移地址的内容。a[5]表示取指针a向后偏移5个指针a所指类型数据长度(即int型)的位置处的内容。C语言不检查数组越界,因此a[5]在编译期不会报错。&a[5]代表该位置的地址,相当于a+5。因此q-p相当于a+5-a,答案自然为5.

大学c语言设计,求解释程序段
C语言提供了一种用于多分支选择的switch语句, 其一般形式为:switch(表达式){ case 常量表达式1: 语句1;case 常量表达式2: 语句2;…case 常量表达式n: 语句n;default: 语句n+1;} 其语义是:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时, ...

第六题c语言,求解释
答案为D c读一个字符 1 d读到有效数字后遇到空格结束,23《空格》s读到有效字符后,遇到空白字符(回车,空格,TAB等)结束,得到456

c语言问题 求解释其中while (!b)的意思
在C语言中,0表示假,非0表示真。while(!b)表示b等于0时,判断条件为真,执行循环体;否则为假,不执行。非运算符(!)为单目运算符,具有右结合性。参与运算量为真时,结果为假;参与运算量为假时,结果为真。例如:!0为真;!9为假。虽然C编译在给出逻辑运算值时,以“1”代表“真”,“0 ...

c语言题目,求解惑
2d是C语言中printf函数的输出格式说明符。具体解释如下:使输出的int型的数值以2位的固定位宽输出。如果不足2位,则在前面补空格;如果超过2位,则按实际位数输出。注:如果输出的数值不是int型,则进行强制类型转换为int,之后按上面的格式输出。举例如下:printf("%2d", 12); \/\/ 输出12 printf...

C语言问题,求原因解!
X代表十六进制,p代表a数组的首地址 第一个printf()输出194就是说数组a的首地址是十六进制的194 p+9就是指向0的位置,a中每一个元素占用2个字节,那么从a的开始到0共占用2*9 = 18个字节18的十六进制是12,所以194 + 12 = 1a6故选D ...

相似回答