?? 51.htm
字號:
<BR> return語句可以向調用函數返回值, 但這種方法只能返回一個參數,
在許多情
<BR>況下要返回多個參數, 這是用return語句就不能滿足要求。Turob C2.0提供了另一
<BR>種參數傳遞的方法, 就是調用函數向被調用函數傳遞的形式參數不是傳遞變量本身,
<BR>而是傳遞變量的地址, 當子函數中向相應的地址寫入不同的數值之后, 也就改變了
<BR>調用函數中相應變量的值, 從而達到了返回多個變量的目的。
<BR> 例4:
<BR> #include<stdio.h>
<BR> void subfun(int *m, int *n); /*說明子函數*/
<BR> int main()
<BR> {
<BR> int i, j;
<BR> printf("i, j=?\n");
<BR> scanf("%d, %d",
&i, &j); /*從鍵盤輸入2個整數*/
<BR> printf("In main
before calling\n"/*輸出此2數及其乘積*/
<BR>
"i=%-4d j=%-4d i*j=%-4d\n", i, j, i*j);
<BR> subfun(&i,
&j); /*以傳送地址的方式調用子函數*/
<BR> printf("In main
after calling\n"/*調用子函數后輸出變量值*/
<BR>
"i=%-4d j=%-4d i*j=%-4d\n", i, j, i*j);
<BR> getch();
<BR> return 0;
<BR> }
<BR> void subfun(int *m, int *n)
<BR> {
<BR> *m=*m+2;
<BR> *j=*i-*j;
<BR> printf("In subfun
after calling\n" /*子函數中輸出變量值*/
<BR>
"i=%-4d j=%-4d i*j=%-4d\n", *i, *j, *i**j);
<BR> }
<P> 上例中, *i**j表示指針i和j所指的兩個整型數*i和*j之乘積。
<BR> 另外, return語句也可以返回一個指針, 舉例如下。
<BR> 下例中先等待輸入一字符串, 再等待輸入要查找的字符,
然后調用match() 函
<BR>數在字符串中查找該字符。若有相同字符, 則返回一個指向該字符串中這一位置的
<BR>指針, 如果沒有找到, 則返回一個空(NULL)指針。
<BR> 例5:
<BR> #include<stdio.h>
<BR> char *match(char c, char *s);
<BR> int main()
<BR> {
<BR> char s[40],
c, *str;
<BR> str=malloc(40);
/*為字符串指什分配內存空間*/
<BR> printf("Please
input character string:");
<BR> gets(s);
/*鍵盤輸入字符串*/
<BR> printf("Please
input one character:");
<BR> c=getche();
/*鍵盤輸入字符*/
<BR> str=match(c,
s); /*調用子函數*/
<BR> putchar('\n');
<BR> puts(str);
/*輸出子函數返回的指針所指的字符串*/
<BR> getch();
<BR> return 0;
<BR> }
<BR> char *match(char c, char *s)
<BR> {
<BR> int i=0;
<BR> while(c!=s[i]&&s[i]!='\n')/*找字符串中指定的字符*/
<BR>
i++;
<BR> return(&s[i]);
/*返回所找字符的地址*/
<BR> }
<BR>
<P> 三、用全程變量實現參數互傳
<BR> 以上兩種辦法可以在調用函數和被調用函數間傳遞參數,
但使用不太方便。如
<BR>果將所要傳遞的參數定義為全程變量, 可使變量在整個程序中對所有函數都可見。
<BR>這樣相當于在調用函數和被調用函數之間實現了參數的傳遞和返回。這也是實際中
<BR>經常使用的方法, 但定義全程變量勢必長久地占用了內存。因此, 全程變量的數目
<BR>受到限制, 特別對于較大的數組更是如此。當然對于絕大多數程序內存都是夠用的。
<BR> 例6:
<BR> #incluide<stdio.h>
<BR> void disp(void);
<BR> int m[10];
/*定義全程變量*/
<BR> int main()
<BR> {
<BR> int i;
<BR> printf("In main
before calling\n");
<BR> for(i=0; i<10;
i++){
<BR>
m[i]=i;
<BR>
printf("%3d", m[i]); /*輸出調用子函數前數組的值*/
<BR> }
<BR> disp();
/*調用子函數*/
<BR> printf("\nIn
main after calling\n");
<BR> for(i=0; i<10;
i++)
<BR>
printf("%3d", m[i]); /*輸出調用子函數后數組的值*/
<BR> getch();
<BR> return 0;
<BR> }
<BR> void disp(void)
<BR> {
<BR> int j;
<BR> printf("In subfunc
after calling\n");/*子函數中輸出數組的值*/
<BR> for (j=0; i<10;
j++){
<BR>
m[j]=m[j]*10;
<BR>
printf("%3d", m[i]);
<BR> }
<BR> }
<BR>
<P> 2.3 函數的遞歸調用
<BR> Turbo C2.0允許函數自己調用自己, 即函數的遞歸調用,
遞歸調用可以使程序
<BR>簡潔、代碼緊湊, 但要犧牲內存空間作處理時的堆棧。
<BR> 如要求一個n!(n的階乘)的值可用下面遞歸調用:
<BR> 例8:
<BR> #include<stdio.h>
<BR> unsigned ling mul(int n);
<BR> int main()
<BR> {
<BR> int m;
<BR> puts("Calculate
n! n=?\n");
<BR> scanf("%d",
&m); /*鍵盤輸入數據*/
<BR> printf("%d!=%ld\n",
m, mul(m));/*調用子程序計算并輸出*/
<BR> getch();
<BR> retun 0;
<BR> }
<BR> unsigned long mul(int n)
<BR> {
<BR> unsigned long
p;
<BR> if(n>1)
<BR>
p=n*mul(n-1); /*遞歸調用計算n!*/
<BR> else
<BR>
p=1L;
<BR> return(p);
/*返回結果*/
<BR> }
<BR>運行結果:
<BR> calculate n!
n=?
<BR>輸入5時結果為:
<BR> 5!=120
<P> 3. 函數作用范圍
<BR>
<BR> Turbo C2.0中每個函數都是獨立的代碼塊, 函數代碼歸該函數所有,
除了對函
<BR>數的調用以外, 其它任何函數中的任何語句都不能訪問它。例如使用跳轉語句goto
<BR>就不能從一個函數跳進其它函數內部。除非使用全程變量, 否則一個函數內部定義
<BR>的程序代碼和數據, 不會與另一個函數內的程序代碼和數據相互影響。
<BR> Turbo C2.0中所有函數的作用域都處于同一嵌套程度,
即不能在一個函數內再
<BR>說明或定義另一個函數。
<BR> Turbo C2.0中一個函數對其它子函數的調用是全程的,
即是函數在不同的文件
<BR>中, 也不必附加任何說明語句而被另一函數調用, 也就是說一個函數對于整個程序
<BR>都是可見的。
<P> 4. 函數的變量作用域
<BR> 在Turbo C2.0中, 變是可以在各個層次的子程序中加以說明,
也就是說, 在任
<BR>何函數中, 變量說明有只允許在一個函數體的開頭處說明, 而且允許變量的說明(
<BR>包括初始化)跟在一個復合語句的左花括號的后面, 直到配對的右花括號為止。
它
<BR>的作用域僅在這對花括號內, 當程序執行到出花括號時, 它將不復存在。當然,
內
<BR>層中的變量即使與外層中的變量名字相同, 它們之間也是沒有關系的。
<BR> 例9.
<BR> #include<stdio.h>
<BR> int i=10;
<BR> int main()
<BR> {
<BR> int i=1;
<BR> printf("%d\t,
i);
<BR> {
<BR>
int i=2;
<BR>
pritnf("%d\t", i);
<BR>
{
<BR>
extern i;
<BR>
i+=1;
<BR>
printf("%d\t", i);
<BR>
}
<BR>
printf("%d\t", ++i);
<BR> }
<BR> printf("%d\n",
++i);
<BR> return 0;
<BR> }
<BR> 運行結果為
<BR> 1 2 11
3 2
<BR> 從程序運行的結果不難看出程序中各變量之間的關系, 以及各個變量的作用域。
<BR>
<P>
<A HREF="index.html">返回目錄</A>
<BR>
<BR>
<BR>
</BODY>
</HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -