C語言指標

PO8·發表於2020-11-10

在這裡插入圖片描述

地址

我們想去一個地方,可以通過這個地方的名字來找,比如“中餐廳”,也可以通過這個地方的地址來找,比如“xx路xxx號”。
在程式設計當中,我們可以通過變數名來訪問變數的資料,也可以通過地址來訪問。

在這裡插入圖片描述

:這兩個地址08和0C相差4個位元組也就是32位,1在記憶體中展現為 28個0 0001,int型就是4個位元組

&是運算子,叫做取址符,用於去除變數對應的地址
*號是運算子,用於取出地址中存放的資料

其實指標就是地址
指標=地址

不同的資料型別
Int 存放的是整數
Char 存放的是字元
Int array【】 陣列,存放的是一串資料
Int *p; 指標,存放的是地址

如何定義執政指標,以下兩種都可以
在這裡插入圖片描述
在這裡插入圖片描述
要知道的是,指標也是變數的一種型別,只是定義的時候需要加一個 *。實際變數名是不帶 * 的。
只有在定義指標的時候是一個識別符號,其他時候都是運算子,表示乘法
或取內容的運算如printf(“%d”,
(&a));

用指標訪問變數

在這裡插入圖片描述

指標訪問int、char型,指標的自加

在這裡插入圖片描述

這裡的++p表示先自加再呼叫輸出。
可以看到指向a的地址的指標自加後指標後移了四個位元組,這是因為int型別佔4個位元組
指向c的地址的指標自加後指標後移了一個位元組,這是因為char型別佔1個位元組
這裡的指標自加可以想象成遊標卡尺一段段的後移。

指標與陣列

在這裡插入圖片描述
在實際編寫過程中,定義完指標,給指標變數賦的值應該是地址,所以不能漏掉取址符&
在使用完指標遍歷陣列輸出後,如果還要使用這個指標,應注意指標歸位,否則溢位陣列的範圍會造成出現亂碼(隨機資料)的現象。

練習:輸入三個資料(任意數量)找最大最小算平均,用指標優化 函式體

在這裡插入圖片描述
Main函式
在這裡插入圖片描述
執行結果
在這裡插入圖片描述

注意要點是:
指標用完,下一次再用的是哦胡要注意歸位,否則會出現陣列溢位
在函式中定義了一個指標變數作為形式引數,在主函式傳遞時傳遞的應是地址或相應指標變數
在陣列中,相鄰元素的地址是連續的(相隔相應型別所佔位元組,如int就是4bit,指標自加時也會跳轉相應的地址所佔位元組個數),在使用指標(地址)表示資料時,除了注意自加,還不能忘記加上 * 表示指標所指地址中所存放的資料。
使用完指標注意自加,再迴圈體內要注意自加的位置。

為什麼要用指標

C語言可以通過指標將資料存放在想要的地址當中,這是其他語言沒有辦法做到的
在這裡插入圖片描述

int *p2=(int *)0x0060FEF4;//先將這個地址強制轉換,告訴編譯器這個地址上將儲存一個int型別

//沒有強制轉換則系統不知道要存什麼型別,就不能直接存,*(0x0060FEF4)=10;是錯的

*p2 = 10;//p2指標指向地址,用 * 取值,即將10存放再這個地址

//上方兩句也可寫成 *(int *)0x0060FEF4=10;

要點就是要掌握上方的這些。

地址需要加上 * 符號作為取址符才能訪問它所存放的資料,而這裡是識別符號。

指標定義中int* p;p是指標即地址,int *表示地址中存放的資料是int型,加上括號 (int *)地址 強制轉換,和(float)是一個道理。

需要強制轉換才能存放資料的原因:

我們不知道我們想要用的地址是否已經存了別的資料,存的資料是什麼型別,所以需要強制轉換再使用。

這樣交換,a和b並沒有緩過來,思考為什麼?

在這裡插入圖片描述
而用指標的方式可以交換
在這裡插入圖片描述
把他簡化一下
在這裡插入圖片描述

可以看到a的值在函式中發生了變化,但是在輸出時還是10.

這是因為在函式體執行中,當輸出完a的值,函式執行結束,函式體內的東西都會被清空。

在主函式中,a=10會存在某個地址,函式體當中,a的值會存放再另一個地址。當函式執行結束,存放函式體的a的地址會被釋放。所以沒有改變主函式的a的值。

在這裡插入圖片描述

在函式中,對p修改就是對(0x0060FF08)進行修改。

——理解為:p是存放地址的指標變數,p就是0x0060FF08,兩者是等價的,對p修改就是對(0x0060FF08)進行修改,只是指標變數p存放在0x0060EFE4這個地址,在函式執行完後,這個地址釋放,而主函式中a的值能夠修改。

第一種情況有兩個地址,兩個10;第二種情況傳遞的是10的地址,只有1個10.

這裡再回顧指標的定義,int *p;

定義時的*作為識別符號,表示這裡定義的是指標變數,這個指標變數的變數名是p,用於存放一個地址—— p=&a;這裡&是取址符。

P是地址,不是資料,如果要讀取或改變p中的資料需要加上 * 。printf(“%d”,*p);

相關文章