學習C語言帶參數的函數

 
主要學習變量的作用域和存儲類型,以及參數傳遞的兩種方式。最後學習如何將數組作爲函數進行傳遞。
重點學習局部變量和全局變量之間的區別、靜態存儲類型以及傳值調用和引用調用的區別。
“域”,就是範圍;而“作用”,應理解爲:“起作用”,也可稱爲“有效”。所以作用域就是指一個事物起作用的範圍。同樣,一個變量的作用域,就是變量在代碼中起作用的範圍,或者說,一個變量的“有效範圍”。變量在程序或模塊內可訪問性稱爲它的作用域。
示例:
#include <stdio.h>
void addNumbers();//函數原型,注:分號不能少
void main()
{
    
int sum=0;//聲明變量同時初始化
    addNumbers();//調用函數
    printf("  主函數中 sum 的值是 %d   ",sum);//格式化輸出sum的值
}

//被調函數addNumbers()
void addNumbers()
{
     
int num1,num2,sum;//聲明變量
     printf("  請輸入兩個數:");
     scanf(
"%d %d",&num1,&num2);//格式化輸入函數
     sum=num1+num2;
     printf(
" 子函數中 sum 的值是 %d  ",sum);//格式化輸出sum 的值
}


屏幕輸出:
請輸入兩個數:56 45
子函數中sum的值是101
主函數中sum的值是 0
代碼中的變量,有的可以在整個程序中的所有範圍內起作用,這稱爲“全局”變量。而有的只能在一定範圍內起作用,稱爲“局部”變量。
局部變量是在函數內作定義說明的變量。
關於局部變量的作用域還要注意以下幾點:
Ø         主函數中定義的變量也只能在主函數中作用,不能在其它函數中使用。同時,主函數中也不能使用其它函數中定義的變量。因爲主函數也是一個函數,它與其它函數是平行關係。
Ø         形參變量是屬於被調函數的局部變量名,實參變量是屬於主調函數的局部變量。
Ø         允許在不同的函數中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會發生混淆。
Ø         在複合語句中也可定義變量,其作用域只在複合語句範圍內。
全局變量是在函數外部定義的變量。它不屬於哪一個函數,而是屬於一個源程序文件。其作用域是整個源程序。另外需要說明的是,不是所有全局變量都可以直接使用。只有定義在該函數之前的全局變量,才能在函數中使用。
關於全局變量還要注意以下幾點:
Ø         如果同一程序的多個函數都操縱同一個變量,全局變量會比較有用。
Ø         外部變量可加強函數模塊之間的數據聯繫,但是又使函數要依賴這些變量,因而使得函數的獨立性降低。從模塊化程序設計的觀點來看這是不利的,因此在不必儘量不要使用全局變量。
Ø         在同一源文件中,允許全局變量和局部變量同名。在同名的局部變量的作用域內,全局變量不起作用。
示例:
#include <stdio.h>
void addNumbers();//函數原型
int sum=0;//全局變量
void main()
{
       addNumbers();
//調用函數
       printf("  主函數中 sum 的值是 %d   ",sum);
}

void addNumbers()
{
       
int num1,num2;
       printf(
"  請輸入兩個數:");
       scanf(
"%d %d",&num1,&num2);
       sum
=num1+num2;
       printf(
" 子函數中 sum 的值是 %d  ",sum);
}


屏幕輸出:
請輸入兩個數:56 45
子函數中sum的值是101
主函數中sum的值是 101
存儲類型
Ø         變量的存儲方式可分爲“靜態存儲”和“動態存儲”兩種
Ø         靜態存儲變量是一直存在的,而動態存儲變量則時而存在時而消失
Ø         這種由於變量存儲方式不同而產生的特性稱爲變量的生存期
Ø         生存期表示了變量存在的時間
存儲類型
說明
 
auto
自動變量
局部變量在缺省存儲類型的情況下歸爲自動變量。
register
寄存器變量
存放在CPU的寄存器中。對於循環次數較多的循環控制變量及循環體內反覆使用的變量均可定義爲寄存器變量。
static
靜態變量
在程序執行時存在,並且只要整個程序在運行,就可以繼續訪問該變量。
extern
外部變量
作用域是整個程序,包含該程序的各個文件。生存期非常長,它在該程序運行結束後,才釋放內存。
靜態局部變量
Ø         靜態局部變量生存期爲整個源程序
Ø         靜態局部變量作用域與自動變量相同,即只能在定義該變量的函數內使用該變量
Ø         對基本類型的靜態局部變量若在說明時未賦以初值,則系統自動賦予0值
Ø         函數被調用時,其中的靜態局部變量的值將保留前次被調用的結果
示例:
#include <stdio.h>
void format() //被調函數應放在調用函數的前面
{
       
static int m = 0//靜態局部變量,它的值將保留前次被調用的結果
       m++;
       
if (m % 10 == 0)
              putchar(
' '); 
       
else
              putchar(
' '); 
}

void main()
{
       
int i;
       
for(i=0;i<50;i++)
       
{
              printf(
"%d",i);
              format();
//調用函數
       }

}

靜態全局變量
Ø         靜態全局變量與普通全局變量在存儲方式上完全相同
Ø         區別在於:非靜態全局變量的作用域是整個源程序;而靜態全局變量的作用域只是定義它的文件
函數調用方式
       首先學習形參和實參的概念:所謂形參就是“函數在聲明或定義時,所寫出的參數定義”。而實參是“實際調用時,傳給函數的實際參數,是爲實參”。
       參數是調用函數的代碼傳給被調函數的數據,在C語言中,參數有兩種傳遞方式:傳值方式和引用方式。這兩個名詞分別指:傳遞“參數的值”和傳遞“參數的地址”。
傳值調用示例:
#include <stdio.h>
void func(int);
void main()
{
   
int a = 0//初始化a值爲0
   func(a); //調用函數func
   printf("%d",a); //輸出a的結果
}

//定義函數func
void func(int a)
{
   a 
= 10//讓參數a等於10
}

輸出:0
傳地址調用示例:
#include <stdio.h>
void func(int);
void main()
{
   
int a = 0//初始化a值爲0
   func(&a); //調用函數F
   printf("%d",a); //輸出a的結果
}

//定義函數F
void func(int *a)
{
   
*= 10//讓參數a等於10
}

輸出:10
數組作爲函數參數
Ø         在用數組作實參時,以傳址方式調用函數,也就是說把實參數組的首地址賦給形參
Ø         實際上形參數組和實參數組爲同一數組,共同擁有一段內存空間
Ø         數組元素通過傳值或引有方式作爲函數參數進行傳遞。在傳值調用中,數組元素的值傳遞給函數。在引用調用中,數組元素的地址傳遞給函數。
Ø         將數組作爲參數傳遞時,它指向數組的第一個元素,即數組的首地址。因此,向函數傳遞數組與引用調用十分類似。傳遞數組時不需要“&”運算符。
Ø         形參數組和實參數組的長度可以不相同,因爲在調用時,只傳遞首地址而不檢查形參數組的長度。當形參數組的長度與實參數組不一致時,雖然不出現語法錯誤(編譯能通過),但是程序執行結果將與實際不符。
Ø         數組作爲參數也可以通過一個指向數組的指針來實現。
示例:
#include <stdio.h>
#define N 5
void sort(float[]);
void main()
{
     
float grade[N];
     
int i;
     printf(
"  輸入 %d 個學員的成績: ",N);
     
for(i=0;i<N;i++)
       scanf(
"%f",&grade[i]);
     sort(grade);
     printf(
"  排序後的成績爲: ");
     
for(i=0;i<N;i++)
        printf(
"%5.2f ",grade[i]);
     printf(
" ");
}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章