C語言考前的查漏補缺【函式的基本知識】
C語言考前查漏補缺=W=
首先會將自己遇到的問題列出來,然後綜合起一個模組一起回答=W=
一、C語言函式的基本知識
1.對於函式的理解:C語言中,函式可以沒有形式引數麼?
2.函式的預設返回型別為什麼形?
3.函式在命名時,形式引數,區域性變數,外部引數的同名問題
4.靜態變數的真正用法和含義
5.關於return語句的理解
6.一個例項,用於說明其關係。
問題的回答
變數型別 | 定義位置 | 作用域 | 儲存位置 | 解釋說明 |
---|---|---|---|---|
全域性變數 | 函式體外 | 定義點起到整個程式結束 | 靜態儲存區 | 生命週期為整個執行期間,static型別全域性變數僅限本檔案使用,非static可用extern聲明後使用 |
靜態區域性變數 | 函式體內 | 所在函式語句塊內部 | 靜態儲存區 | 定義時使用關鍵字static,生命週期為程式的的整個執行期間 |
自動區域性變數 | 函式體內 | 所在函式語句塊內部 | 動態資料區 | 定義時使用關鍵字auto(可省略),週期為函式(或者語句塊)的執行期間。 |
暫存器變數 | 函式體內 | 所在函式語句塊內部 | CPU通用暫存器 | 定義時使用關鍵字register,現很少使用 |
A1:
C語言中,函式當然可以沒有形式引數,但是函式在定義時是平等的,既函式不可以巢狀定義,如果函式的返回引數預設,那麼自動填補成int。
A2:
函式的返回引數值預設,自動填補成int形。
A3:
1.區域性變數的作用域僅僅在本函式或者語句塊,所以不同函式中可以出現相同名字的區域性變數。
eg:#include <stdio.h>
int fun(int x)
{ printf("%d",x);
return 0;}
int main()
int x;
scanf("%d",&x);
fun(x);
return 0;
}//其是合理且正確的
3.外部變數是在函式外部定義的變數,與區域性變數可以同名,只不過在同名區域性變數所在的作用域內部該全域性變數將不再起作用。
A4:(借鑑大佬部落格)
通常,在函式體內定義了一個變數,每當程式執行到該語句時都會給該區域性變數分配棧記憶體。但隨著程式退出函式體,系統就會收回棧記憶體,區域性變數也相應失效。但有時候我們需要在兩次呼叫之間對變數的值進行儲存。
通常的想法是定義一個全域性變數來實現。但這樣一來,變數已經不再屬於函式本身了,不再僅受函式的控制,給程式的維護帶來不便。
靜態區域性變數正好可以解決這個問題。靜態區域性變數儲存在全域性資料區,而不是儲存在棧中,每次的值保持到下一次呼叫,直到下次賦新值。
靜態區域性變數有以下特點:
1.該變數在全域性資料區分配記憶體;
2.靜態區域性變數在程式執行到該物件的宣告處時被首次初始化,即以後的函式呼叫不再進行初始化;
3.靜態區域性變數一般在宣告處初始化,如果沒有顯式初始化,會被程式自動初始化為0;
4.它始終駐留在全域性資料區,直到程式執行結束。但其作用域為區域性作用域,當定義它的函式或語句塊結束時,其作用域隨之結束。
啊
A5:
return語句一般與函式的返回值有關係,不妨將其分成void型和非void型兩大類進行討論總結
1.對於void型:其可以沒有return語句,函式執行到函式體的結束標誌右大括號時會自動停止,或者可以有return,但是其後不跟任何表示式,表示執行到此處時返回。
2.對於非void型:其必須有return語句,並且return後表示式應與返回值的形式一樣,不一樣時就會進行自動型別轉換(會導致資料不準確),執行return時,系統將自動生成無名變數用來儲存,接受該值,函式的生命週期結束後,該空間立即被釋放
A6:一個例子=W=
#include <stdio.h>
int fun(int i)
{
return i*i;
}
int main()
{
int i=0;//主函式定義的自動變數i
i=fun(i);
for( ;i<3;i++)
{
static int i=1;//複合語句中定義的靜態變數i
i+=fun(i);
printf("%d",i);
}
printf("%d",i);
return 0;
}
其答案為:
2,6,42,3
前三個答案是i在迴圈裡進行計算和表達
最後一個是輸出了主函式定義裡的i的值,也可以說的上是迴圈了幾次。
本菜雞的總結結束勒!