C語言 沒想到指標還能這麼用 !!!

2021-09-02 19:59:28 字數 2327 閱讀 9995

相信大家當初學習c語言的時候,老師一定跟你說過這樣的一句大實話:【指標,是c語言的靈魂】。

筆者自出來工作以來,幾乎天天都要跟c語言打交道,回過頭來想一想,這話確實沒有錯。

指標是什麼?相信所有的c語言教程,都會告訴你:【指標就是位址】。沒錯,的確是這麼回事。c語言的指標就好比房屋的位址,只要有了位址,我們就可以訪問到全世界的每乙個角落。c語言的世界也是如此,位址就是一切,有了位址,就沒有幹不成的事情。

在c語言裡,如果想對乙個int型別的變數a進行賦值操作,我們會這樣寫: a = 5;這樣的形式,就是直接訪問。對應的,我們有間接訪問的方式,就是通過指標來實現。比如我們可以定義乙個指標 int *b = &a; 指標b存放的是a變數的位址,我們通過這樣: *b = 5;一樣可以實現對a進行賦值操作,這就是間接訪問的力量。

c語言的指標是靈活的,它不僅可以像如上**一樣,指向乙個普通變數,它也可以指向乙個結構體變數,甚至還可以指向乙個函式名。原因就在於,函式名,在c語言的語法裡,本質上就代表了函式的執行位址,說白了,它也是乙個「指標」。而這,就是我們以下要詳細介紹的【函式指標】。

【函式指標】,顧名思義,就是乙個指向函式的指標,它的本質還是乙個指標,只不過這個指標指向的內容是乙個函式。

在講解【函式指標】之前,我們先假設有若干個函式,它們的原型定義如下所示:

int test_function_1(int arg);

int test_function_2(int arg);

int test_function_3(int arg);

...int test_function_n(int arg);

從函式原型上我們可以知道,這些個函式都是接收乙個int型別的形參,返回值型別為int型。從原型上看,這幾個函式幾乎是一模一樣,那麼我們有沒有方法可以將這些原型一致的函式重新整理定義呢?答案肯定是,有的。

追求高效、簡潔的c語言就我們提供了乙個非常有用的關鍵字typedef,通過typedef我們可以重新創造出乙個新的資料型別,而不再侷限於c語言的基本資料型別。比如我們就可以利用typedef定義乙個叫形如上述函式原型的【函式指標】資料型別,它的寫法如下所示:

typedef int (*function)(int arg);
從定義上看,因為()擁有最高優先順序,所以*function首先結合在一起,這就決定了它是乙個指標。接著,*function的後面接上了(int arg),這就是函式的入參;而前面的int 就表示函式的返回值。這就是【函式指標】的原型定義。

【函式指標】最為一種特殊的指標,自然它也是要指向內容才能使用的,毫無疑問,它就是要指向對應原型的函式。具體怎麼使用呢?

【函式指標】這種高階用法,可能有些人用得比較少,但是如果你閱讀過類似openssl這樣的大型c語言編寫的開源**之後,相信你一定會感嘆:原來,c語言的指標還能這麼用!!!

int test_function_1(int arg)

int test_function_2(int arg)

int test_function_3(int arg)

typedef int (*function)(int arg);

int function_pointer_test_1(void)

int function_pointer_test_2(void)

; //終極大招,迴圈處理3個函式的間接呼叫

for (i = 0; i < sizeof(func_array); i ++)

return 0;

}int main(int argc, char **argv)

/*總結:

雖然通過兩個呼叫的方式,輸出結果是一致的,但是顯然方式2的處理更為高效、簡潔;

從**的字裡行間,彷彿看到c語言的「多型」:將不同的函式名賦值給同乙個函式指標變數;

使用同乙個函式指標發起函式呼叫,得到不一樣的結果輸出,這不就是多型嗎?

*/

通過如上的示例**,c語言的【多型】你get到了嗎?

千萬不要小瞧了上面的示例**,如果你能熟練掌握其中的【指標精髓】,再去閱讀一些業內廣泛使用的c語言編寫的開源專案原始碼,比如大名鼎鼎的openssl;相信閱讀之後,你的c語言功力一定會大大地提公升。

不過,值得注意的是,文中的示例**均是筆者在非程式設計環境下編寫,屬於【白板程式設計】,難免會出現編寫錯誤、編譯不過、或執行結果不正確的情況;還請細心的讀者誠心指正,感激不盡。

程式設計題(C ) 萬萬沒想到之聰明的編輯

單個字串的最大長度 using namespace std int main else if node1 1 臨時工作陣列中有乙個數,相同存入,不同則用當前i處的字元替換臨時工作陣列的第乙個數 else b node2 a i else if node1 2 臨時工作陣列有兩個數,i處字元相同則跳過...

工具條按鈕上的下拉列表 沒想到是這麼容易實現的

製作步驟 1 新增乙個 timagelist imagelist1,然後載入些圖示 2 新增兩個 tpopupmenu popupmenu1 popupmenu2,並分別新增些選單項 3 新增乙個 t 控制項 1,通過其右鍵選單 new button 新增兩個按鈕 toolbutton1 toolb...

c 實現 萬萬沒想到之聰明的編輯(拼寫糾錯)

題目 三個同樣的字母連在一起,一定是拼寫錯誤,去掉乙個的就好啦 比如 helllo hello 兩對一樣的字母 aabb型 連在一起,一定是拼寫錯誤,去掉第二對的乙個字母就好啦 比如 helloo hello 上面的規則優先 從左到右 匹配,即如果是aabbcc,雖然aabb和bbcc都是錯誤拼寫,...