相信對于學習過C語言的人來說指針一直是一個難點。其實C語言也就只有這么一個難點,攻破了這個難點,要做的就是不斷實踐了,畢竟想好學好一門語言不實踐是不行的。
每一個變量都有一個內(nèi)存位置,每一個內(nèi)存位置都定義了可使用連字號(&)運算符訪問的地址,它表示了在內(nèi)存中的一個地址,我們先了解什么是內(nèi)存地址以及如何訪問它??聪旅娴膶嵗?,它將輸出定義的變量地址:
當上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結果:
接下來讓我們看看什么是指針吧!
指針是一個變量,其值為另一個變量的地址,即內(nèi)存位置的直接地址。就像其他變量或常量一樣,您必須在使用指針存儲其他變量地址之前,對其進行聲明。指針變量聲明的一般形式為:
type *name;
這里的type 是指針的基類型,它必須是一個有效的 C 數(shù)據(jù)類型,name 是指針變量的名稱。用來聲明指針的星號 * 與乘法中使用的星號是相同的。但是,在這個語句中,星號是用來指定一個變量是指針。以下是有效的指針聲明:
所有指針的值的實際數(shù)據(jù)類型,不管是整型、浮點型、字符型,還是其他的數(shù)據(jù)類型,都是一樣的,都是一個代表內(nèi)存地址的長的十六進制數(shù)。不同數(shù)據(jù)類型的指針之間唯一的不同是,指針所指向的變量或常量的數(shù)據(jù)類型不同。
在此列出一些平??赡苡玫降闹羔樌?/p>
小編推薦一個學C語言/C++的學習裙【?六四二,一二零,九一四 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內(nèi)有開發(fā)工具,很多干貨和技術資料分享!
接下來我們看下什么是函數(shù)指針
一個函數(shù)總是占用一段連續(xù)的內(nèi)存區(qū)域,函數(shù)名在表達式中有時也會被轉換為該函數(shù)所在內(nèi)存區(qū)域的首地址,這和數(shù)組名非常類似。我們可以把函數(shù)的這個首地址(或稱入口地址)賦予一個指針變量,使指針變量指向函數(shù)所在的內(nèi)存區(qū)域,然后通過指針變量就可以找到并調(diào)用該函數(shù)。這種指針就是函數(shù)指針。
函數(shù)指針的定義形式為:
returnType (*pointerName)(param list);
returnType 為函數(shù)返回值類型,pointerNmae 為指針名稱,param list 為函數(shù)參數(shù)列表。
注意:
( )的優(yōu)先級高于*,第一個括號不能省略,如果寫作returnType *pointerName(paramlist);
就成了函數(shù)原型,它表明函數(shù)的返回值類型為returnType *。
下面寫一個簡單的栗子:
編譯并運行結果如下:
上面對msg函數(shù)進行了調(diào)用,fun_p是一個函數(shù)指針。
總結:
指針(Pointer)就是內(nèi)存的地址,C語言允許用一個變量來存放指針,這種變量稱為指針變量。指針變量可以存放基本類型數(shù)據(jù)的地址,也可以存放數(shù)組、函數(shù)以及其他指針變量的地址。
常見的指針含義: