函式之概覽

2021-07-23 23:05:47 字數 2519 閱讀 9445

函式是程式設計師編寫的,用於實現功能的**塊.

《資料型別》  《函式名稱》  (《形式引數說明》)

//《資料型別》為返回值即[表示式]的型別

//函式名稱是乙個識別符號

//形式引數說明是對變數的定義.可以為void,表示無參

//(《函式引數說明》)後面必須有一對{},{}中的內容被稱為函式體.

//函式體中可以有語句序列,可以沒有.

//return語句必須有,但是[表示式]可以沒有.

//有些人資料型別/形式引數說明/return語句可以沒有,這些東西你沒寫也沒有報錯,編譯器沒有報錯不代表你沒有寫錯.

//編譯器編譯程式的時候將你的**處理了一下,加上了這些東西,當然也可能加錯.

//各種編譯器有不同的處理方式,這些處理方式是透明的.

//如果你不希望不同的編譯器編譯出來的程式不一樣,那麼請按照規範來.

其中 <> 表示必須有,表示可有可無,根據具體功能決定

只要實現了這個模板,就可以寫出來乙個語法正確的函式.當然,功能不一定正確.

函式返回值被存入%eax暫存器(x86平台),%eax的內容不會被銷毀

函式名稱是用識別符號表示的,代表了函式的入口位址

//函式指標的賦值和通過函式指標呼叫好像很亂,或者說是編譯器處理了錯誤,不過下面的都是合法的

void fun(void)

//void (*p0)(void) = fun;//合法

//void (*p1)(void) = &fun;//合法

typedef

void(*fun_p)(void);

fun_p *p0 = fun;

fun_p *p1 = &fun;

typedef

void(fun_type)(void);

fun_type *p2 = fun;//合法

fun_type *p3 = &fun;//合法

int main(int argc,int ** argv)

說明的意思是定義

函式呼叫的時候引數按照從右向左的順序被定義在棧裡面

函式體實現了函式的功能

一般情況下,在函式入口都要對引數進行檢測,而且這些檢測最好打包成乙個函式

檢測的話,有兩種方式

//模組內部用if

#include

if(expression)

//對外介面函式用assert

//如果在assert.h中定義了ndebug,那麼assert函式相當於被注釋了

//如果沒定義,如果expression為false,那麼會呼叫abort函式,結束程序

//如果沒定義,如果expression為true,什麼都不做

#include

void assert(scalar expression);

函式的介面使用函式的宣告即函式原型來體現的
1/起什麼名字

最好見到名字知道功能

2/要多少引數

函式實現的功能越簡單越好,所以引數不可能太多

3/返回值

是採用值-結果方式還是返回值方式

4/健壯性

一定要用assert函式

5/通用性

函式一定要朝小了寫

6/移植性

函式的語法一定要規範

函式的最右邊的引數入棧,…,最左邊的引數入棧(在大多數的c編譯器中,引數是由右往左入棧 )

函式中的區域性變數入棧(注意靜態變數是不入棧的)

返回值被複製到%eax暫存器

區域性變數出棧

引數出棧(先進先出,後進後出)

執行棧頂指標指向的記憶體中的位址對應的指令

函式引數傳遞的本質

所有的傳參都是複製傳參

即在棧中重新定義了乙個變數,並對變數賦值為實參的值

值-結果傳遞

一般傳遞結構體或者陣列的時候用的是值-結果傳遞方式

因為採用這種方式會減少棧的開銷,棧裡面只需要定義乙個指標就可以了,所以只需要4個位元組.

如果不採用這種方式,傳遞乙個結構體變數,那麼結構體有多大,棧中就必須定義乙個相同的結構體變數,開銷大.

陣列的傳遞

int b = ;

//形參可以多種多樣

void test(int a)

void test(int a[n])

void test(int *a)

//實參只能為陣列名

int main(int argc, char ** argv)

api的中文翻譯是應用程式介面,嗯,就是函式介面

有人說還有人說api就是系統呼叫,這是錯的.但可以說系統呼叫是api.

api是程式設計師提供的一系列函式介面和具體實現的總稱

你如果說你寫了乙個函式就是乙個api,如果你確實這樣說的話,嗯,要不就是太牛x,要不就是太傻x.

api舉例

在各個層面上都有api

嗯,在工作方面不是很切合實際,因為你發現你沒有人力資源可以調動.嗯,說的沒錯,就是這麼悲傷.

Hash函式概覽

最先進的非加密雜湊函式在過去幾年中得到了快速推廣。當我這週搜尋的時候,我很高興的看到新的尖端雜湊函式已經發布即使上次我進行這個方面的搜尋是6個月到1年前的事情了。非加密雜湊函式將字串作為輸入,通過計算輸出乙個整數。理想的雜湊函式的乙個特性是輸出非常均勻分布在可能的輸出域,特別是當輸入非常相似的時候。...

常量之概覽

整型常量 浮點型常量 字元型常量 字串型常量 指標型常量 陣列型常量 結構體型常量 常量的定義與宣告指的是將乙個識別符號與常量聯絡起來.聯絡起來之後,識別符號代表乙個唯讀變數.然後可以通過該識別符號引用該常量 可以通過以下方法定義或宣告常量 宣告 define define pi 3.1415926...

Python函式簡單概覽

遞迴函式 把生活中的咖啡機看成乙個函式。它們都滿足這三個要點 組織好的 做咖啡的過程已經設定在了機器裡 可重複使用的 做完一次咖啡,下次還能用 用來實現特定功能 用咖啡豆和水做咖啡 寫函式的通用思路 告訴計算機,要定義乙個函式 函式的名字是什麼 這個函式需要輸入什麼引數 引數的處理過程是什麼樣的 把...