c語言 《指標的奧妙》

2021-08-21 05:34:12 字數 1671 閱讀 6052

近來,又有同學問我 ,關於指標的知識,回顧兩年的程式設計之路,不知不覺,我離c語言的道路方向也偏差了很多,其實我好久都沒有碰過c語言了。但是這次回顧,我又對指標有了新的認識。

首先 ,指標他到底是個什麼東西呢?其實他並沒有多麼奇妙,他就是乙個普通的變數,不過他裡面放的是同型別的位址,哈哈,我還是舉個例子吧,老是說概念也挺枯燥的。

int a,*p = &a;
上面這一行**,定義乙個int變數,再定義乙個指標變數,指標變數指向變數a的位址。這麼來說夠形象吧~。

對,這就是最簡單的指標。然後的話,再說點概念性的東西,哈哈不要頭大,就是介紹一下啦。

大家都知道 在32位機器上(或者使用的是32位軟體),指標的所佔位元組大小都是4個,其中包括,int* ,double*,float*,char*.....,這些基本資料型別的指標變數都是佔4個位元組。有些同學在這裡就會有疑惑,為什麼 明明double佔8個位元組,而double*佔4個位元組,4比8小,為什麼還可以容納下double的資料。你們先好好想下,想不通再看下面的解答吧。

其實啊,有這種問題的同學啊,都忽略了乙個最重要的事實,這個 指標所佔位元組數跟你 資料所佔位元組數 根本不在乙個層面上。 指標說白了 就是位址。再給個比喻,指標就好比你家的門牌號,你家的面積代表資料所佔的位元組數,不管你家是多麼大,只要我有你家門牌號,我就可以訪問到你家,這個毫無疑問對吧,所以疑雲是不是快要被解開啦?

如果還沒有清楚,那麼我在深入一下。請看:

首先 再問一下你們知道為什麼指標就是只佔四個位元組嗎 ?把這個搞懂了,你就會明白這個問題啦。

在計算機內,位址匯流排每根有兩個狀態(二進位制),決定著定址範圍,這個範圍最大值,就是記憶體容量的最大值。例如在32位機器上,位址匯流排32位,就是2的32次方,可以定址2的32次方個 位元組(可定址的記憶體容量) 約等於4gb,所以大家也大概都聽過32位機器最大記憶體就是4gb, 因為他的定址能力限制了你只能安裝4gb的記憶體,再大的話是檢測不到的。 好了不扯這麼多啦, 乙個位元組是8位,32位機器上,32/8 = 4,所以兩兩位址之間的間隔就是4個位元組。那這樣的話,是不是很輕鬆就可以知道了指標為什麼佔4個位元組。

看下圖,保你看懂了不會再有疑問!

注意我紅框的內容, 變數c的位址是0x0019ff34。因為上面顯示的位址是16進製制,所以一組二進位制代表乙個位元組。不知道你們發現乙個秘密沒有!!

,在指標的世界,每個位元組都會有他的位址 !!!!!!,,在指標的世界,每個位元組都會有他的位址 !!!!!!

,在指標的世界,每個位元組都會有他的位址 !!!!!!

,在指標的世界,每個位元組都會有他的位址 !!!!!!

,在指標的世界,每個位元組都會有他的位址 !!!!!!

把這句話念10遍!!,你的大腦就會越發的清晰~~ 所謂的指標 就是只存乙個變數的首位元組位址 (即門牌號) 拿圖上的資料說就是 c的位址就是0x0019ff34。但是這個位址只是c 變數的首個位元組的位址, c變數後面的三個位元組位址資訊 指標是不理會的,因為指標已經知道了他的資料型別,還知道他的門牌號。這不是就輕而易舉拿到位址的值了嗎?

所以 位址是位址 (指標就是位址) 資料是資料,不要把指標和位址 搞混掉了。 是不是很清晰啦~~?

指標的奧妙

今天看了指標這一章書,看得有點似懂非懂。開始知道原來指標是c語言中的精華,想到自己卻對指標一點也不知道怎麼去用,自己都覺得有點慚愧啊。今天花了好長的時間去寫指標這篇課後習題10.3這道題,就是因為自己對指標不懂如何運用,才搞得自己花費很長時間才寫出來了。題目要求 輸入10個整數,將其中最小的數與第乙...

C 綜合揭秘 反射的奧妙

反射是乙個程式集發現及執行的過程,通過反射可以得到 exe或 dll等程式集內部的資訊。使用反射可以看到乙個程式集內部的介面 類 方法 字段 屬性 特性等等資訊。在system.reflection命名空間內包含多個反射常用的類,下面 列出了常用的幾個類。型別 作用 assembly 通過此類可以載...

C語言的指標

如果乙個指標變數存放的又是另乙個指標變數的位址,則稱這個指標變數為指向指標的指標變數。在前面已經介紹過,通過指標訪問變數稱為間接訪問。由於指標變數直接指向變數,所以稱為 單級間址 而如果通過指向指標的指標變數來訪問變數則構成 二級間址 從下圖可以看到,name是乙個指標陣列,它的每乙個元素是乙個指標...