全國二級C知識點總結5-函數
- 2019 年 11 月 21 日
- 筆記
本課重要知識點:
1、知識點:函數的概述
l C源程式是由函數組成的,函數由函數首部與函數體組成,函數體包括聲明部分和執行語句部分組成。
l C語言程式可以由多個源程式組成,其中一個源程式文件包含main函數,其他函數可以寫在另外的源程式文件中,為單獨文件,並且可以單獨編譯。
例1:(10-03-11)以下敘述正確的是( B )
A)C語言程式是由過程和函數組成的
B)C語言函數可以嵌套調用,例如:fun(fun(x))
C)C語言函數不可以單獨編譯
D)C語言中除了main函數,其他函數不可以作為單獨文件形式存在
【解析】選項A錯誤,C語言中沒有過程的概念;選項B正確,C語言可以嵌套調用(此知識點在後面介紹);選項C錯誤,C語言中可以對包含一個或多個函數的源程式單獨編譯;選項D錯誤,C語言函數可以單獨存在。
l C程式的執行總是從main函數開始,完成對其它函數的調用後再返回到main函數,最後由main函數結束整個程式。main 函數可以調用其它函數,而不允許被其它函數調用。一個C源程式必須有,也只能有一個主函數main。
例1:下列敘述中正確的是( C )
A)C語言程式將從源程式中第一個函數開始執行
B)可以在程式中由用戶指定任意一個函數作為主函數,程式將從此開始執行
C)C語言規定必須用main作為主函數名,程式將從此開始執行,在此結束
D)main可作為用戶標識符,用以命名任意一個函數作為主函數。
l 在一個函數的函數體內,不能再定義另一個函數,即不能嵌套定義。
例1、下列敘述中正確的是( D )
A)每個C程式文件中都必須要有一個main()函數
B)在C程式中main ()函數的位置是固定的
C)C程式中所有函數之間都可以是固定的
D)在C程式的函數中不能定義另一個函數
【解析】一個C源程式可以由多個C程式文件,但只能有一個main()函數,並不是每個C程式文件都必須要有一個main(),main()函數可以放在任意位置,且不允許被其他函數調用,因此正確答案是D。
2、知識點:函數的定義
例1:以下正確的函數定義形式是:(C)
A)double fun(int x,int y);{} B)double fun(int x ;inty){}
C) double fun(int x,int y){} D) double fun(int x, y);{}
【解析】在函數中對形參的說明,要求對每個形參都必須說明類型,各參數之間用「,」隔開,函數定義後應無「;」。
l 函數返回return語句的一般形式:return 表達式;或return (表達式);
在函數中允許有多個return語句,但每次只能有一個return語句被執行。
例1:(10-03-24)以下關於return語句敘述中正確的是( B)
A)一個自定義函數中必須有一條return語句
B)一個自定義函數中可以根據不同情況設置多條return語句
C)定義void類型的函數中可以有帶返回值的return語句
D)沒有return語句的自定義函數在執行結束時不能返回到調用處。
【解析】自定義函數中可以沒有return語句(如不需要返回值的函數,常見void類型)),可以有多條return語句(如在分支結構中,可以從不同分支中返回到調用程式,常見if..else);定義成void類型的函數,不允許從該函數取得返回值,也不允許使用return語句。沒有return語句的函數在執行到函數的最後一條語句後自動返回達到調用處。
Ø 函數值的類型與函數定義中函數的類型保持一致,如不一致,以函數類型為準。
例2:(06-04-23)已定義以下函數
intfun(int *p){return *p;} fun函數返回值是( B )
A)不確定的值 B)一個整數 C)形參P中存放的值 D)形參P的地址值
【解析】函數返回性類型取決於定義函數時函數名稱前的類型,fun前是int,表明函數fun執行完畢後返回一個整型數。正確答案:B
Ø return 後的表達式可以是常量、變數、表達式,也可以空。
如:return ; return 0; return a; return (a+b);
3、知識點:形參和實參及函數調用
l 形參出現在函數定義中(即定義函數時函數名後面括弧中的參數),實參出現在主調函數中(調用函數時函數名後面括弧中的參數)
l 形參在本函數體內都可以使用,離開該函數則不能使用。實參在主調函數中內有效,進入被調函數後,實參變數也不能使用。(註:在進行函數調用時,函數必須有確定的值)
l 實參向形參單向傳遞數值,不能將形參的值反向的傳送給實參。實參和形參在數據上、類型上、順序上要一致。在函數調用過程中,形參的變化不會改變實參的變化。
例1、(09-09-24)有以下程式
#include<stdio.h>
void fun(int p)
{ int d=2; p=d++;printf(「%d」,p); }
main()
{ int a=1;
fun(a); printf(「%dn」,a);
} 程式運行後的輸出結果是( C)
A) 32 B)12 C)21 D)22
【解析】此題考點為函數參數的傳遞。C語言中函數參數的傳遞是值傳遞,是把實參的值傳給形參,是單向傳遞,形參的改變不會影響到實參的值。程式中,把實參a的值傳給形參p,p=1,然後p=d++,再次賦值後p=2,輸出p的值2。返回到主程式中,輸出a的值為1。(形參p的改變不會影響到實參a的值,a的值仍為1).因此答案為C.
l 在傳遞數值時,形參和實在分別佔據不同的存儲單元(形參變數只有在被調用時才分配記憶體單元,調用結束後,即刻釋放分配的記憶體單元)
例1、(07-04-25)若函數調用時的實參為變數時,以下關於函數形參和實參的敘述中正確的是( D)
A)函數的實參和其對應的形參共占同一存儲單元
B)形參只是形式上的存在,不佔用具體存儲單元
C)同名的實參和形參占同一存儲單元
D)函數的形參和實參分別佔用不同的存儲單元
【解析】本題考點是函數的參數定義,在函數中,主調數中裡邊的參數叫做實參,而被調函數裡邊的參數叫做形參,當函數傳遞時,傳遞的是值,它們佔用的不是同一存儲單元,而且在傳遞中,是單向傳的,由實參傳向形參。
l 「傳值」與「傳址」的區別:傳數值的話,形參的變化不會改變實參的變化。傳地址的話,形參的變化就有可能改變實參所對應的量。
例1:(10-03-26)有以下程式
#include <stdio.h>
void fun(char *c,int d)
{ *c=*c+1; d=d+1;
printf(「%c,%c」,*c,d);
}
main()
{ char b=』a』, a=』A』;
fun(&b,a);
printf((「%c,%cn」,b,a);
} 程式運行後的輸出結果是(A)
A) b,B,b,A B)b,B,B,A C)a,B,B,a D)a,B,a,B
4、知識點:函數調用的一般形式和調用方式
l 函數調用的一般形式為:函數名(實際參數表);
實參可以是常數、變數或其他構造類型數據及表達式,也可以沒有(當為無參函數時)
l 函數調用的方式:
(1)函數表達式:函數作為表達式中的一項出現在表達式中,以函數返回值參與表達式運算。例如:z=max(x,y);
(2)函數語句:函數調用的一般形式上加上分號。例如:printf(「%dn」,a);
(3)函數實參:函數作為另一個函數調用的實際參數出現。例如:printf(「%d」,max(x,y));
l 程式從main函數進入,上往下執行,當碰到函數名後,把值傳給調用函數,當程式得到了返回值或調用函數結束,再順序往下執行,最後到main函數結束。
5、知識點:函數的聲明及其位置
l 函數要「先定義後調用」,或「先聲明再調用後定義」。函數的聲明一定要有函數名、函數返回值類型、函數參數類型,但不一定要有形參的名稱。
一般形式為:
類型說明符被調函數名(類型形參,類型形參…);
或 類型說明符被調函數名(類型,類型…);
注意:其末尾「;」不能省
例如:int max(int a,int b); 或 int max(int ,int); 兩者功能相同
例1、(06-09-32)若有以下函數首部
int fun(double x[10],int *n)
則下面針對此函數聲母語句中正確的是(D)
A)int fun(double x,int *n); B)int fun(double,int);
C)int fun(double*x,int n); D)int fun(double *,int。);
【解析】本題考點是對函數的聲明,在函數聲明的時候,其格式如下:返回值類型函數名(參數類型[參數名],參數類型[參數名]……)其中,參數名可以不寫,但是參數類型一定要寫全
l 省去主調函數中對被調函數的函數說明的幾種情況:
(1)被調函數的返回值是整型或字元型時(返回值自動按整型處理)
(2)當被調函數的函數定義在主調函數之前時
(3)在所有函數定義之前,在函數外預先說明了各個函數的類型
例2:(10-09-24)有以下程式
#include<stdio.h>
int f(int x);
main()
{ int n=1,m;
m=f(f(f(n))); printf(「%dn」,m);
}
int f(intx)
{ returnx*2;}
程式運行的輸出結果( D )
A) 1 B)2 C)4 D)8
【解析】f函數定義在main下面,但在外部進行聲明int f(int x);因此在main中可直接調用。
三次調用函數:f(n)=f(1)=2 f(2)=4 f(4)=8 m=f(f(f(n)))=f(f(f(1)))=f(f(2))=f(4)=8
例3:(11-03-12)有以下程式,請在 【12】處填寫正確語句,使程式可正常編譯運行。
【12】;
main()
{ doublex,y,(*p)();
scanf("%lf%lf",&x,&y);
p=avg;
printf("%fn",(*p)(x,y));
}
double avg(double a,double b)
{ return((a+b)/2);}
答案:double avg(double a,doubleb); 或double avg(double ,double );
【解析】當函數定義在調用之後,調用前必須對函數進行申明,申明的形式和函數定義中的函數頭部分相同,最後加分號即可。
6、知識點:函數的嵌套調用
l C語言中不允許作嵌套的函數定義,但是允許在一個函數的斷定儀中出現對另一個函數的調用,即嵌套調用。
例1:(06-04-33)有以下程式
intfunl(double a){return a*=a;}
int fun2(double x,double y)
{double a=0,b=0;
a=funl(x);b=funl(y);return (int)(a+b);
}
main()
{double w;w=fun2(1.1,2.0);……}
程式執行後變數w中的值是( C )
A)5.2l B)5 C)5.0 D)0.0
【解析】此題考查函數的嵌套調用。main函數中調用了fun2函數;fun2函數中又調用了如fun1函數w=fun2(1.1,2.0)–>w=(int)(funl(1.1)+funl(2.0))àw=(int)5.21;w值為5,但是w是double類型變數,故將5轉換成5.0賦值給變數w
例2、(09-3-24)有以下程式
#include<stdio.h>
int f(int x,int y)
{return ((y-x)*x);}
main()
{ int a=3,b=4,c=5,d;
d=f(f(a,b),f(a,c));
printf(「%dn」,d);
} 程式運行後的輸出結果是( B )
A) 10 B)9 C)8 D)7
【解析】程式的main()函數中,定義了4個變數,前3個分別初始化,D用來接收調用函數後返回的值,主函數一共調用了3次f()函數,第一次傳遞a,b的值,給形參x,y,返回(y-x)*x的值為3,第二次將a,c的值傳遞給形參x,y,返回(y-x)*x的值為6,接著將f(a,b),f(a,c)的值3、6傳遞給形參,執行後返回值9,賦值變數d,最後輸出結果為9
7、知識點:函數的遞歸調用
l 函數直接或間接地調用自己稱為函數的遞歸調用。遞歸調用必須有一個明確的結束遞歸的條件。在做遞歸題時可把遞歸的步驟一步步寫下來,不要弄顛倒了。
例1、(04-09-37)在函數調用過程中,如果函數funA調用了函數funB,函數funB又調用了函數funA,則 ( B )
A)稱為函數的直接遞歸調用
B)稱為函數的間接遞歸調用
C)稱為函數的循環調用
D)C語言中不允許這樣的遞歸調用
【解析】此題考查函數遞歸的基本概念。一個函數直接或間接調用自己稱為函數的遞歸調用;若直接調用了自己,則稱為直接遞歸調用,若間接調用了自己則稱為間接遞歸調用;根據間接遞歸調用的概念可知,本題中的函數調用為間接遞歸調用。
例2、(09-09-15)
#include <stdio.h>
fun(int x)
{ if(x/2>0) fun(x/2);
printf(「%d 」,x);
}
main()
{ fun(6); printf(「n」);}程式運行後的輸出結果是__1 3 6______
【解析】程式的執行過程是先遞推、後遞歸的過程。當x=1時,條件不成立,遞推終止。程式執行流程參照示意圖。
例3:(10-03-33)有以下程式
#include <stdio.h>
int f(int t[],intn);
main()
{ int a[4]={1,2,3,4},s;
s=f(a,4); printf(「%dn」,s);
}
int f(int t[],int n)
{ if(n>0)return t=[n-1]+f(t,n-1);
elsereturn 0;
}程式運行後的輸出結果是( B)
A) 4 B) 10 C)14 D)6
【解析】s=f(a,4)=t[3]+f(a,3)=4+f(a,3)=4+t[2]+f(a,2)=4+3+f(a,2)=7+t[1]+f(a,1)
=7+2+f(a,1)=9+t[0]+f(a,0)=9+1+f(a,0)=10+0=10
例4:(11-03-32)設有如下函數定義
int fun(int k)
{ if(k<1) return 0;
else if(k==1) return 1;
else return fun(k-1)+1;
}若執行調用語句:n=fun(3);,則函數fun總共被調用的次數是( B)
A)2 B)3 C)4 D)5
【解析】遞歸調用,fun(3)—> fun(2)—> fun(1) ;fun(1)—1—> fun(2)—2—> fun(3)—3—>n;所以fun總共被調用的次數是3,最後n為3。
例5:(11-03-34)有以下程式
int fun (int x,int y)
{ if(x!=y) return ((x+y)/2);
else return (x);
}
main()
{ inta=4,b=5,c=6;
printf("%dn",fun(2*a,fun(b,c)));
}程式運行後的輸出結果是( B)
A)3 B)6 C)8 D)12
【解析】函數遞歸調用,fun(8,fun(5,6)),其中fun(5,6)因為5!=6, return ((x+y)/2)為5,所以fun(8,fun(5,6))為fun(8,5),8!=5, return ((x+y)/2)為6
8、知識點:局部變數和全局變數
l 在一個函數內部或複合語句內部定義的變數,它只在本函數範圍內有效,也就是說只有在本函數內才能使用它們,在函數以外是不能使用這些變數的。這稱為局部變數,局部變數又稱為內部變數。函數的形參也屬於局部變數。
l 在函數外部定義的變數,稱為全局變數,又稱為外部變數。全局變數可以被本文件的其他函數所共用。
例1、(07-09-40)在一個C語言源程式文件中所定義的全局變數,其作用域為(D)
A)所在文件的全部範圍 B)所在程式的全部範圍
C)所在函數的全部範圍 D)由具體定義位置和extem說明來決定範圍
【解析】本題考點是全局變數的作用域,全局變數的作用域是,從變數定義開始,一直到程式程結束為止,當然,也可以在其它文件中用這個以定義的全局變是,但是要通過extern來進行聲明,本題答案選D。
例2、(09-09-11)有以下程式
#include<stdio.h>
int a=5;
void fun(int b)
{ int a=10;a+=b;
printf(「%d」,a)
}
main()
{ int c=20;
fun(c); a+=c;
printf(「%dn」,a);
}程式運行後的輸出結果是____3025____
【解析】全局變數的作用域為定義開始到文件結束。局部變數的作用域為定義其函數內部。當局部變數與全部變數同名時,在局部變數作用域內,全部變數不起作用。
執行函數fun(c): 實參c 將值傳給形參b,即b=20,函數內部定義局部變數a起作用,a=10,a+=b a=a+b=10+20=30,輸出a的值為30
返回到主函數: a+=c 此時a為全局變數的值 a=a+c=5+20=25 輸出a值25
注意格式控制符無空格,所以連續輸出
9知識點:變數存儲類別(auto變數、register變數、static變數)
Ø 靜態變數(static):
(1)在編譯時分配存儲空間,所佔存儲單元直到程式結束時才釋放,它的值在程式運行過程中一直存在,且變數的初始化只進行一次。
(2)static說明符可以用於全局變數,也可用於局部變數(auto和resgiter不可以定義全局變數)但是,當它說明變數後,只要這個變數還在程式中存在,那麼不管用到還是沒有用到,它都將會佔用記憶體單元。
例1:(10-09-36)有以下程式:
#include <stdio.h>
int f()
{ static int x=1;
x+=1; return x;
}
main()
{ int i,s=1;
for(i=1;i<=5;i++)s+=fun();
printf(「%dn」,s);
} 程式運行後的輸出結果是( B)
A)11 B)21 C)6 D)120
【解析】fun函數被調用了5次,每次調用後的值返回值累加到s上。
第一次:靜態局部變數定義有效,x=2,返回值為2。s=s+fun()=1+2=3;從第2次調用開始,靜態局部變數的定義相當於不存在,直接使用x的值。
第二次:x=3 s=3+3=6 第三次:x=4 s=6+4=10
第四次:x=5 s=10+5=15 第五次:x=6 s=15+6=21
例2:(11-03-34)有以下程式
int fun()
{ staticint x=1;
x*=2;
return x;
}
main()
{ inti,s=1;
for(i=1;i<=3;i++)s*=fun();
printf("%dn",s);
}程式運行後的輸出結果是(D)
A)0 B)10 C)30 D)64
【解析】靜態變數static類型,在函數執行完後空間並不釋放,而且只初始化一次。所以第一次調用後,x的值為2,返回後s的值為2,第二次調用後,x的值為2*2=4,返回後s的值為2*4=8,第三次調用後,x的值為4*2=8,返回後s的值為8*8=64,故選D。
Ø 自動變數(auto)
(1)自動變數的存儲空間是當程式執行到定義它的函數或語句塊時才分配,當函數執行結束後自動釋放,變數的值也就不再存在。
(2)局部變數的存儲類別默認為auto,可以省略不寫,但它不能定義全局變數。
Ø 暫存器變數(register):
例1、(08-04-39)在C語言中,只有在使用時才佔用記憶體單元的變數,其存儲類型是( A )。
A)auto和register B)extern和register C)auto和static D)static和register
【解析】auto變數在進入函數體時,系統為其分配存儲單元,退出時自動釋放;register是建議編譯程式將變數的值保存在cpu的暫存器中,而不是佔用記憶體單元;extern可以對全局變數加以說明,擴展其作用域,在整個程式中都有效,所以會一直佔用記憶體單元;static說明符可以用於全局變數,也可用於局部變數,使變數在整個程式執行期間一直佔用記憶體單元,本題答案選A。
例2:(10-09-34)設函數中有整形變數n,為保證其在未賦初值的情況下初值為0,應該選擇的存儲類別是( C )
A)auto B)register C)static D)auto或register
【解析】對於靜態局部變數(static),如在定義時不賦初值的話,編譯時自動賦初值0(對數值型變數)或空字元(對字元變數)。而對於自動變數(auto或者預設不寫),如果不賦初值則它的值是一個不正確的值。
10、內部函數與外部函數
l 用static 進行說明的函數稱為靜態函數,也叫內部函數。靜態函數只能被本編譯單元體內的函數調用。一般形式:static 類型標識符函數名(形參表)例如:staticint fun(){…}
11、知識點:庫函數
l 函數可以分為庫函數和用戶自定義函數。庫函數由C系統提供,用戶無須定義,在調用C語言標準庫函數時要包含include命令,include命令行以#開頭;
例1、(07-04-17)若有代數式 (其中e僅代表自然對數的底數,不是變數),則以下能夠正確表示該代數式的C語言表達式是( C)
A)sqrt(abs(nx+ex)) B) sqrt(fbs(pow(n,x)+pow(x,e)))
C)sqrt(fabs(pow(n,x)+exp(x,e))) D)sqrt(fabs(pow(x,n)+exp(x)))
【解析】exp()函數的功能是返回以自然數e為底、函數參數x為冪的指數值ex ;pow(n,x)函數是計算nx ;fabs()函數的功能是返回函數參數的絕對值;sqrt()用於返回函數參數的平方根。所以正確答案為C。
例2:以下說法不正確的是(B)
A)標準庫函數按分類在不同的頭文件中聲明
B)用戶可以重新定義標準庫函數
C)系統不允許用戶重新定義標準庫函數
D)用戶若需要調用標準庫函數,調用前必須使用預編譯命令將該函數所在文件包括到用戶源文件中
【解析】對每一類庫函數,都有相應的頭文件名,調用某個庫函數時,用戶在源程式中須用include命令包含其頭文件名。每一類標準庫函數是C語言本身提供的,用戶不能重新定義標準庫函數。
12、知識點:數組與函數
l 數組用作函數參數有兩種形式:把數組元素(下標變數)作為實參使用和把數組名作為函數的形參和實參使用。
l 數組元素作函數的實參與普通變數並無區別,所進行的傳遞是值,形參變數和實參變數佔據由編譯系統分配的兩個不同的記憶體單元;
l 數組名作為函數參數時,所進行的傳遞是地址(相當於把實參數組的首地址賦予形參數組名或指針名),形參數組與實參數組為同一數組,共同擁有一段記憶體單元;
例1:(2011-09-31)以下程式的主函數中調用了在其前面定義的fun函數
#include<stdio.h>
main()
{double a[15],k;
k=fun(a);
}則以下選項中錯誤的fun函數首部是 ( D)
A.double fun(double a[15]) B.double fun(double *a)
C.double fun(double a[]) D.double fun(double a)
【解析】當一維數組名a作為實參時,對應形參有三種表示形式:*a、a[ ]、a[N]( 註:N為定義a數組時的元素個數)
例1:(11-03-11)己知a所指的數組中有N個元素。函數fun的功能是,將下標k(k>0)開始的後續元素全部向前移動一個位置。請填空。
Void fun(int a[N],int k)
{ inti;
for(i=k;i<N;i++) a[【11】] = a[i];
}
答案:i-1
【解析】a[i]的值賦給a[i-1]
例2:(10-09-32)有以下程式
#include <stdio.h>
#define N 8
void fun(int *x,int i)
{ *x=*(x+i); }
main()
{ inta[N]={1,2,3,4,5,6,7,8},i;
fun(a,2);
for(i=0;i<N/2;i++)
{ printf(「%d」,a[i]);}
printf(「n」);
}程式運行後的輸出結果是( C )
A) 1 3 1 3 B)2 2 3 4 C) 3 2 3 4 D) 1 2 3 4
【解析】數組名代表數組首地址,即a[0]的地址。函數調用:fun(a,2) 參數傳遞後,形參指針x獲得數組首地址,即指向a[0],形參變數i=2;*x即為a[0],*(x+2)即a[2],*x=*(x+2)相當於a[0]=a[2],a[0]變為3,a[2]不變。返回到主程式:循環4次,輸出a數組前4個元素: 3 2 3 4
例3:(10-09-25)有以下程式
#include <stdio.h>
void fun(char *s)
{ while (*s)
{if (*s%2==0) printf(「%c」,*s); s++;}
}
main()
{ char a[]={「good」};
fun(a);printf(「n」);
}注意:字母a的ASCII碼值為97,程式運行後的輸出結果是( A )
A) d B)go C)god D)good
【解析】調用fun(a)函數,實參字元數組名a傳遞給形參字元指針s,使s指向字元串「good」;在函數fun中對字元串進行遍歷,如果指針s指向字元ASCII碼值是偶數則輸出該字元。在字元串「good」中,只有「d」的ASCII碼值為偶數
13指針與函數
l 函數指針變數是指向函數的指針變數。
定義的一般形式為: 類型說明符(*指針變數名)(); 例如: int (*pf)();
調用函數的一般形式:(*指針變數名)(實參表) 例如:z=(*p)(x,y);
Ä注: (*指針變數名)中的「()」不能少
例1:(09-09-33)設有以下函數:
void fun(int n,char *s){…} 則下面對函數指針的定義和賦值均正確的是( A )
A)void (*pf)(); pf=fun; B)void *pf(); pf=fun;
C)void *pf(); *pf=fun; D)void (*pf)(int,char);pf=&fun;
【解析】本題考點為指向函數的指針的用法。函數名代表函數的入口地址,可以賦值給指向函數的指針。指向函數的指針應該定義為void (*pf)().如定義為void *pf(),則表示函數pf返回值為一個基類型為 void的指針。
l 函數指針變數不能進行算術運算。
l 指針型函數是指返回指針值的函數。定義的一般形式為:
類型說明符 *函數名(形參表){…} 例如:int *ap(int x,int y){}
例1:(10-09-11)有以下程式
#include <stdio.h >
int*f(int *p,int *q)
main()
{ int m=1,n=2,*r=&m;
r=f(r,&n) ; printf(」%dn」,*r) ;
}
int *f(int *p,int *q)
{ return(*p>*q) ?p :q ;}
程式運行後的輸出結果是______2_____
【解析】本題中f是個指針型函數,返回值為指針值。如示意圖。主程式中,指針r指向m,函數調用f(r,&n)時,實參傳遞給形參,形參指針p指向m,指針q指向n,*p的值為m的值1,*q的值為n的值2,所以函數返回值為q,返回給主程式中的指針r,即指針r指向了n,最後輸出*r的值為n的值2.
例2:(11-03-29)有以下程式
void fun(char *c)
{ while(*c)
{ if(*c>=』a』&&*c<=』z』)*c=*c-(『a』-『A』);
c++;
}
}
main()
{ chars[81];
gets(s); fun(s); puts(s):
}當執行程式時從鍵盤上輸入Hello Beijing<回車>,則程式的輸出結果是( C )
A)hello beijing B)Hello Beijing C)HELLO BEIJING D)hELLO Beijing
【解析】gets(s)將輸入的Hello Beijing賦給了字元數組s,調用fun(s),將字元數組s的首地址傳給了c,c指向的即為字元數組的首地址,通過指針變數c取得字元數組中的字元判斷是不是小寫字母,如果是變成大寫字母。*c=*c-(『a』-『A』)完成小寫換大寫的功能。故選C。另外注意gets(s)和scanf(「%s」,s);的區別:scanf以空格作為字元串輸入結束的標誌,而gets(s)不需要