假設主函式main()。其他函式void fun(int a,int *b)。
關於函式定義和宣告:
在程式碼中fun函式,有完整函式體的程式碼就是函式定義部分,比如void fun(int a,int *b){。。。};。
如果沒有具體實現的函式體程式碼(也就是大括號內容),那麼就是函式宣告。比如void fun(int ,int *);
關於函式宣告和呼叫:
如果fun函式定義在main程式碼上面。比如:
void fun(int a,int *b){。。。};
int main(){
int a=0,int b=0;
......
fun(a,&b);//這裡fun定義程式碼在main上面,所以可以不需要宣告。反之需要先寫宣告語句
return 0;
}
關於函式區域性變數及全域性變數:
簡單區分:
定義在函式之外的就是全域性變數,這個變數所有函式都可以直接使用,並且共用同一個地址。任意函式修改了變數值,其他函式呼叫也會變。
定義在函式之內的就是區域性變數,區域性變數只屬於該函式,其他函式即使定義了同樣名字的變數,這兩個變數也不同地址,互不相干。
比如:
int a;//這就是全域性變數,作用域下所有函式共用
int main()
{
int b;//這就是區域性變數,只在本函式有效,如果想在呼叫fun函式時讓fun也使用該變數,需要把這個變數的地址作為引數傳遞過去。
printf("%d",b);
return 0;
注意:c語言中允許區域性變數和全域性變數同名,但是同名的區域性變數會遮蔽全域性變數,實際程式碼避免同名。
關於函式傳值和傳址:
如函式void fun(int a,int *b){..........};這裡形參a 和*b,分別表示一個值和一個地址
所以在呼叫該函式時,比如:
int c,d;
fun(c,&d);//這裡呼叫就對應上面形參型別,第一個引數傳遞了c的值(傳值),第二個引數傳遞了d的地址(傳址),這裡c和&d,叫做實參。當fun函式執行時改變了a和b指向地址的值,對應main函式中c的值不變,d的值改變。
順帶一說:區域性變數,在函式執行結束後會自動釋放,所以想把區域性變數地址作為返回值,需要用malloc函式申請。(這裡看不懂可以暫時忽視)
假設主函式main()。其他函式void fun(int a,int *b)。
關於函式定義和宣告:
在程式碼中fun函式,有完整函式體的程式碼就是函式定義部分,比如void fun(int a,int *b){。。。};。
如果沒有具體實現的函式體程式碼(也就是大括號內容),那麼就是函式宣告。比如void fun(int ,int *);
關於函式宣告和呼叫:
如果fun函式定義在main程式碼上面。比如:
void fun(int a,int *b){。。。};
int main(){
int a=0,int b=0;
......
fun(a,&b);//這裡fun定義程式碼在main上面,所以可以不需要宣告。反之需要先寫宣告語句
return 0;
}
關於函式區域性變數及全域性變數:
簡單區分:
定義在函式之外的就是全域性變數,這個變數所有函式都可以直接使用,並且共用同一個地址。任意函式修改了變數值,其他函式呼叫也會變。
定義在函式之內的就是區域性變數,區域性變數只屬於該函式,其他函式即使定義了同樣名字的變數,這兩個變數也不同地址,互不相干。
比如:
int a;//這就是全域性變數,作用域下所有函式共用
int main()
{
int b;//這就是區域性變數,只在本函式有效,如果想在呼叫fun函式時讓fun也使用該變數,需要把這個變數的地址作為引數傳遞過去。
printf("%d",b);
return 0;
}
注意:c語言中允許區域性變數和全域性變數同名,但是同名的區域性變數會遮蔽全域性變數,實際程式碼避免同名。
關於函式傳值和傳址:
如函式void fun(int a,int *b){..........};這裡形參a 和*b,分別表示一個值和一個地址
所以在呼叫該函式時,比如:
int main()
{
int c,d;
fun(c,&d);//這裡呼叫就對應上面形參型別,第一個引數傳遞了c的值(傳值),第二個引數傳遞了d的地址(傳址),這裡c和&d,叫做實參。當fun函式執行時改變了a和b指向地址的值,對應main函式中c的值不變,d的值改變。
return 0;
}
順帶一說:區域性變數,在函式執行結束後會自動釋放,所以想把區域性變數地址作為返回值,需要用malloc函式申請。(這裡看不懂可以暫時忽視)