1.
1 #define pi 3.14
2 #define Area(R) pi*R*R
3 main()
4 {
5 int r1=5,r2=2;
6 double s=0;
7 s=Area(r1-r2);
8 printf("The area is %f",s);
9 }
10
11 #define pi 3.14
12 #define Area(R) pi*R*R
13 main()
14 {
15 int r1=5,r2=2;
16 double s=0;
17 s=Area(r1-r2);
18 printf("The area is %f",s);
19 }
分析:此题主要考查宏定义的理解及运用。对于编译器而言,遇到宏是直接替换而不会做任何其它动作的。此题中Area(R) pi*R*R, 而R赋值为r1-r2, 所以预编译后的结果为:
pi*r1-r2*r1-r2, 计算结果为3.700000
另外一个就是浮点数运算, 输出结果为双精度类型,float型的有效位数为6位,所以结果是3.700000. 如果是long double型,则输出结果为:? 很奇怪,我在ubuntu上测试,无论类型修改成float, double,long double,输出结果都一样,这是为什么?有待验证。另外,就是在ubuntu上测试printf("float:%d,double:%d,long double:%d\n",sizeof(float),sizeof(double),sizeof(long double)); 输出结果是4,8,12. 应该结果不一样才对。
2. 函数 intcompare(int a,int b),定义为该函数的函数指针P:
int (*p)(int a, int b);
p= compare;
这个简单,不做解释;
3.
1 #include<stdio.h>
2 void sub(char*s,int num)
3 {
4 int i ,j=num;
5 char t;
6 while(j-->1)
7 {
8 for(i=0;i<j;i++)
9 {
10 if(s[i]<s[i+1])
11 {
12 t=s[i];
13 s[i]=s[i+1];
14 s[i+1]=t;
15 }
16 }
17 }
18 }
19 main()
20 {
21 char *s="CEAeded";
22 sub(s,7);
23 printf("%s\n",s);
24
25 return;
26 }
这道题具有很大的迷惑性,基础知识不扎实,很容易得到错误的结果。乍一看,很容易认为是排序程序,从而得到"eeddECA". 但实际运行程序会得到segment falt的错误。这是因为s是一个指针,指向字符常量,对于字符常量而言是不可修改的。如果定义为char s[]="CEAeded"就可以正常运行了,为什么呢?
4.交换两个变量的值,不使用第三个变量,即a=3,b=5, 交换后b=3,a=5。
这个答案是很经典的,反正我是做不出来。
1 unsigned char a=3,b=5;
2 a = a + b;
3 b = a - b;
4 a = a - b;
5
6 或者
7 a = a^b;
8 b = a^b;
9 a = a^b;
5. 内存分配相关的考量:
1 #define N 100
2 void GetMemory1(char*p)
3 {
4 p=(char*)malloc(sizeof(char)*N);
5 strcpy(p,"Have a good day!");
6 }
7
8 char*GetMemory2(void)
9 {
10 char p[]="Have a good day!";
11 return p;
12 }
13
14 void main(void)
15 {
16 char*str1=NULL,*str2=NULL;
17 GetMemory1(str1);
18 GetMemory2(str2);
19 printf("\nstr1:%s",str1);
20 printf("\nstr2:%s",str2);
21 }
结果为:str1:NULL,str2: 乱码。
str1为什么是NULL? malloc分配的内存,在函数执行完成后是否会自动释放,是否是因为此原因? NO. 而是因为在main函数内,str1是一个局部变量,是无法将其指针传递给GetMemory1().
C语言参数传递遵循值传递的规则,指针变量也一样。GetMemory1()的参数是str1变量,而不是str1的地址,所以在GetMemory1()对p进行操作对str1是一点影响也没有的.
str2返回乱码,是因为p是一个局部变量,在函数执行完成后,p已经指向未知的地方,所以显示乱码.
关于此部分,可以参考<<C语言深度解剖>>之一级指针参数;