请高手帮忙分析几个C语言程序,本人是初学者,请多多指教。

2024-12-23 07:02:41
推荐回答(5个)
回答1:

一、有以下程序:
#include
int fun(int a,int b,int c)
{c=a*b;}
main()
{int c;
fun(2,3,c); printf("%d\n",c);
}
fun 里面的int c 变量 和 main 里面的 int c 变量 是不同的变量(虽然都用一个名字,但内存地址是不同的),所以在fun 里面改变的 c 变量的值,是不会影响到main 函数 里面 c变量的值的。

二、有以下程序:
#include
main()
{int a[]={1,2,3,4,5,6,7,8,9,0},*p;
p=a;
printf(“%x\n”,p);prinf(“%x\n”,p+9);
}
若一个int类型的变量占2个字节,第一个printf语句输出的是194,则第二个printf语句输出的结果是
A)212 B)204 C)1a4 D)1a6
选D,一个int占2字节,p 加上 9个int 就等于 194 + 9 * 2; 注意是16进制,所以选D;

三、以下程序运行后的输出结果是_________
#include
#include
main()
{char s[20]=”goodgood!”,*sp=s;
sp=sp+2;sp=”to”;put(s);
}
这个你试一下就知道了嘛,输出的还是goodgood,因为p指针从未做过 * 的动作(运算),也就是说从未改变过指针里面的内容,所以s数组的内容没有改变过。换句话说,在做sp=”to”运算的时候,系统给字符串 to 分配了一个地址,再把这个地址赋给p,此时p已经不指向s[2]了。

四、若有以下说明和定义:
#include
main()
{int(*a)(int*),*b(),w[10],c;
...
}
int fun(int *c) {...}
则以下选项中能正确调用fun函数是
A) a=fun; a(w); B) a=fun; (*a)(&c); C) b=fun;*b(w); D) fun(b);
这个选D,我觉得不用怎么解释了吧,格式问题。

五、假定以下程序经编译和连接后生成可执行文件PROG.EXE,如果在DOS提示符下键入PROG ABCD EFGH IJKL(此处代表Enter键)则输出结果为_________
#include
main(int argc,char *argv[ ])
{while(--argv>0) printf(“%s”,argv[argv]);
printf(“\n”);
}
这个是不是打错了,应该是argv[argc]吧,这个也是试一下就知道了嘛。

六、有以下程序:
#include
main()
{union{short i[2];
long k;
char c[4];
}r,*s=&r;
s->i[0]=0x39;s->i[1]=0x38;
printf(“%x\n”,s->c[0]);
}
已知字符0的ASCII码值的十进制数是48,且数组的第0个元素在低位。以上程序的运行结果是
A) 39 B) 9 C) 38 D) 8

这个你要知道long 占4个字节,short占两个字节, char 占一个字节,这样你明白了吗?union是挺闹心的,简单来说就是空间公用。

回答2:

1.你写的那个fun函数形参类型是传值不是传地址,所以执行完fun后a,b,c的值都没有变化,而你的c没有初始化,如果是局部变量,那就是以前残留在堆栈里的随机值。所以是不确定的
2.194这是16进制的 然后加上9*2=18 = 12H 所以 194H+12H = 1a6H,选D
3. goodgood!
4.A
5.你的程序写错了
6.B

回答3:

第一题 没有return c; 第二题选d;第三题就是to;第四题是A;

回答4:

第一题(由于函数没有返回值,即没有return c;所以,主函数引用函数后c并没赋值,所以此时c是系统初始时的值,不确定。调用函数加上返回值) 第二题(由第一个printf语句知道 p指针所指的地址为0x194int此处为2字节,所以int型指针+1就是偏移两个字节p+9就是指针向后偏移9个int型空间,即2*9=18字节所以加上0x192后,满16进位算,最低位为20,即0x014所以 0x192+0x014= 0X1a6) 第三题(我觉得是togood!) 第四题(选c,要为指针类型) 第五题(答案:IJKLEFGHABCD 这个我也不知道) 第六题(你去看看http://zhidao.baidu.com/question/236947893.html)

回答5:

楼主这些真是怪题啊!
第一题:因为你才c在定义时没有初始化,所以会输出不定值,函数调用时把c的值传递给形参c,这种以传值方式调用的函数是改变不了原来的实参c的,并不会把调用后形参的值再传给实参的,因为这个函数没有显示地返回形参c的值。
int fun(int a,int b,int c)
{c=a*b; return c;}
int m=fun(2,3,m)这样调用m的值才会是6
第三题:刚开始将goodgood!的首地址赋给sp,接着让sp指向字符串goodgood!的第三个字符,然后sp=“to”;时,系统会另辟一块存储区域存储to字符串,而不是将to覆盖sp当前指向的goodgood!中的字符串,然后把to的首地址赋给sp,这样就并没有改变s[20]中保存的字符串goodgood!,所以最后输出goodgood!。