C語言指標學習總結

2022-03-21 04:12:43 字數 3043 閱讀 1283

上學的時候學習c語言,最煩的就是裡面指標,可是指標也恰恰是c語言的靈魂。

最近在重溫資料結構的內容,因為大多資料結構的教材都是用c語言描述的,而資料結構中也大量的用到了指標的內容,所以我就在這篇筆記中記錄一下我這週複習c語言的心得。

先看看百科上對指標的描述。

在電腦科學中,指標(pointer)是程式語言中的乙個物件,利用位址,它的值直接指向(points to)存在計算機儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為「指標」。意思是通過它能找到以它為位址的記憶體單元。

作個比喻,假設將計算機儲存器當成一本書,一張內容記錄了某個頁碼加上行號的便利貼,可以被當成是乙個指向特定頁面的指標;根據便利貼上面的頁碼與行號,翻到那個頁面,把那個頁面的那一行文字讀出來,這就是指標的作用。

下面將通過一些**說明指標在c語言中的表現形式。

int main()
如果用描述這段**,就是下面這個樣子。

怎麼來理解呢?首先這段**裡通過int aint *p定義了兩個變數:分別是p和a,p變數與a變數的定義方式有一些不同,a變數就是c語言中乙個很普通的int型變數,通過a=10將10這個整型賦值給了a。

而p變數的定義前面有乙個 * ,這個 * 表明了p變數是乙個指標變數,指標變數裡面只能存放位址,這個位址是記憶體中的某個位置,在上面的**中我們在p變數裡面存放的是0x2c406b24這個位址,這個位址裡面存放的值必須是int值,在我們這裡,p變數裡面存放的位址是a變數的位址,a變數在定義時就是乙個int,所以是符合要求的。

這樣一來,我們就說p變數指向了a變數,p = &a這句**完成了p指向a的這個操作。這裡沒有寫p = a,那是因為p變數需要的是乙個位址,而不是a變數裡面存放的值,所以&這個操作符就是取位址的意思,通過&a取到a變數在記憶體中的位址,將位址賦值給p指標變數,就使p指向了a。

既然p是乙個指標變數,那它就可以賦值給另外乙個指標變數,如下:

int main()
新定義了乙個指標變數q,將p變數裡的值0x2c406b24這個位址,賦值給q,這樣q變數與p變數裡都儲存了同樣的位址,就是說他們都指向同乙個值。

int main()
介紹完指標,那這個東西有什麼作用呢?如果要修改a變數裡面的值,可以執行a=5,這是沒介紹指標之前的做法。學習完指標後,通過指標也能達到修改a變數裡的值的目的*p=5

這是很有用的,舉個例子,我們來看下面這段**。

void swap(int a,int b);

int main()

void swap(int a, int b)

上面這段**,這段**能夠達到交換a和b的值的目的嗎?答案是不能,因為c語言在呼叫函式時,永遠只能時傳值給函式

在c語言中每個函式都有自己的變數空間,函式的引數也位於這個獨立的空間中,與其它函式沒有關係,上面的**中有兩個函式,乙個是main函式,另乙個是swap函式,所以這兩個函式裡的a,b變數是不同空間中的變數,他們之間毫無關係可言。

所以對swap函式中的a,b做交換,完全不能改變main函式中a,b變數的值。

函式在每次執行的時候,會產生乙個獨立的變數空間,在這個空間中的變數,是函式這次呼叫時所獨有的,稱為本地變數

定義在函式內部的變數就是本地變數,引數也是本地變數。

變數有生存期作用域這兩個屬性。

對於本地變數而言,生存期與作用域都是在本地變數所在的大括號(塊)內。

既然都說到本地變數了,那就總結一下本地變數的一些規則。

本地變數的規則:

又說回上面的交換函式,那麼怎樣才能達到交換main函式裡a,b兩個變數值的目的呢?

void swap(int a,int b);

int main()

void swap(int

*pa, int

*pb)

利用上面所學習的指標,改寫成上面這樣,才能達到交換的目的。

始終記住:c語言在呼叫函式時,永遠只能時傳值給函式。在上面的**中,自然也是傳值進的swap函式,只不過在使用指標時,這個值指的是位址,位址當然也是乙個值。

將main函式中a和b變數的位址傳給了swap函式中的指標變數pa和pb,在swap函式中通過 *pa 和 *pb 操作到了main函式中的a和b,從而達到了交換的目的。

這只是指標的作用之一,用好了指標,才能體現出c語言更多強大的地方。

這是一篇總結指標的文章,那麼我為什麼要提到陣列呢?

因為陣列和指標又太多的相似之處。看下面一段**。

int test(int a, int numofa)

}

其實陣列中的[ ],與 * ,.,&等運算子一樣,也是一種運算子。

上面test函式裡的a陣列變數,本身就是乙個位址,所以我們在呼叫這個函式的時候,需要寫成這樣test( &a, i),需要傳入乙個位址,這個位址所在的變數儲存的就是乙個陣列。

例如:最後在總結一下const關鍵字在指標中的規則:

上面就是我在複習c語言指標時的一些總結,今後有需要新增的也會陸續補充。

C語言指標學習總結

一 概念 二 舉例說明 首先是指標的定義 int p p是乙個整型變數。int p p是乙個指標變數,指向整型變數。int p p是乙個陣列,陣列裡儲存的是指向整型變數的指標 int p p是乙個指標,指向整型陣列的首位址。int p p是乙個函式,返回值是整型指標 int p p是乙個指標,指向乙...

c語言指標學習總結

在指標 int p或char p,中 p是內容,p是指標,呼叫 p 時候類似間接定址 先看個簡單 指標實驗 在linux上gcc編譯執行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ...

學習C語言的指標總結

感謝 非凡程式設計師的黃楊超老師的耐心講解 概論 這一點思考是我從為什麼很多看起來不是很複雜的 比如 facebook 需要大量頂尖高手來開發?這個答案中想到的,正如這位答主所說 事實上,從我的經驗來看,一般來說,很多軟體專案及產品,其在非功能性需求上的成本,難度和工作量,是要超過功能性需求的。在特...