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. 函數 int
compare(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語言深度解剖>>之一級指標參數;