C語言之旅(1)指標

2021-08-10 11:41:27 字數 1498 閱讀 7779

指標是什麼?

指標是變數。

指標是幹什麼用的?

指標是儲存位址的。

指標佔多少個位元組?

對於32位系統來說是4個位元組,對於64位系統來說是8個位元組,當前大多數用的還是32位系統。這裡面說的系統不是計算機的作業系統,而是計算機架構的定址能力。

對於32位系統來說計算機的位址用8位16進製制數表示。因為一位16進製制數相當於4位2進製數字,32=4*8。

指標的型別是什麼?

例如:int *p;指標的型別就是int *;    char * p;指標的型別就是char *;所以指標的型別就是你去掉變數p剩下的部分就是指標的型別。

在這裡面前面的int的意思是指標儲存的位址對應的記憶體裡面儲存的變數是int型別的。佔4個位元組(對於32位定址系統來說)。

下面上**說話:

首先我說一下,計算機記憶體裡面儲存的都是資料,用彙編的思想理解的話,就是sp指向的地方cpu認為是指令;ss指向的地方,cpu認為是棧;ds指向的地方認為是資料。僅此而已,其實本質上他們都是二進位制數字。更本質的是高低電位。在這裡就不多說了。上圖中,我畫了三個部分,(1)二級指標 **p;(2)一級指標*p;(3)資料段中的資料儲存區域。為什麼我的指標沒有說明儲存資料型別,先別著急,往下看。上面我說了,指標就是儲存位址的變數,對於32位定址系統,儲存位址需要4個位元組(4*8=32)。在計算機中,每個位元組 的儲存空間有且只有乙個位址標識。那麼上圖中儲存2a這個數字的位元組空間的位址就是0x5f3b4c,所以說對於一級指標的話,當我們得到0x5f3b4c這個位址標識的時候就可訪問儲存2a的位元組空間了,這個時候計算機會看這個指標儲存位址的對應的空間儲存的資料型別,如果是cha *p;那麼根據編譯器的演算法,會把2a返回;如果是int *p;那麼以0x5f3b4c這個位址為基礎,再次往後查3個位元組。也就是把這四個位元組的資料返回,即是5f4b3c2a。大家知道,*號的作用有兩個:1:宣告指標;2:引用。

當有2級指標**p的時候,那麼我們先去掉乙個*號表示我們使用了這個引用的功能(使用乙個就去掉乙個*號),這樣的就剩下了*p。不用管前面的型別,當計算機看到**p的時候就知道他要要返回乙個指標型別的資料,那麼很明顯,指標佔四個位元組,所以計算機會把0x4cbf2301這個資料返回給你,然而個8位的16進製制數字又是(2)中21這個位元組空間的位址,這個時候計算機又去掉了乙個*號,他也只到是乙個位址,所以就會以21這個位元組的位址為基礎去除4個自己的數字,也就是0x5f3b4c,然後計算機看到剩下的是乙個p了。他就知道,我下面要去的是終極資料了,不再是位址了,那麼要去多少個自己的資料呢?他只能去問前面的型別了,當前面的型別是int(int **p;)的時候,計算機就會返回4個位元組的數字,就是5f4b3c2a;當前面的型別是char(char **p;)的時候,計算機就會返回1個位元組的數字,就是2a;那麼對於3級指標,4級指標,一直到n級指標,原理是一樣的。

C 面試 (1) 指標

指標是c 中一類頗具特色的資料型別,允許直接操作記憶體位址,實現記憶體的動態分配。指標問題通常包括指標常量,常量指標,陣列指標,指標陣列,函式指標,指標傳值等。指標和引用的區別 非空區別。在任何情況下都不能使用指向空值的引用。因此如果你使用乙個變數並讓它指向乙個物件,但是該變數在某些時候也可能不指向...

C 基礎(1) 指標

三.指標使用 四.函式和指標 五.const 和指標 指標是另外一種型別的復合型別,復合型別是指基於其它型別定義的型別 意思是說指標是指向什麼型別,那麼指標本身就是什麼型別 指標其實就是程式資料在記憶體中的位址,而指標變數是用來儲存這些位址的變數 記憶體是乙個很大的,線性的位元組陣列。每乙個位元組都...

c語言010 指標

include int main 注意 p前面的型別決定了取位址的能力。如果是int型別的,就說明在32平台下可以取址能力是4個位元組。2 指標的本質就是儲存乙個位址,在32位的系統上,所有程式的記憶體位址都用4個位元組表示,所以不管是什麼型別的指標。指標大小都佔4個位元組。稱之為間接引用,表示根據...