C 指標的理解

2021-07-06 09:52:24 字數 1919 閱讀 3882

1. 記憶體長成啥樣?

物理記憶體條由連續排列晶元組構成,在計算機中記憶體模型也被抽象為一組連續的儲存空間,每個空間都能夠儲存若干位元組的資料,每一塊儲存空間也有乙個特定的序號,從0到n。

備註:為了便於理解,此處,將記憶體儲存空間橫向排列(實際橫縱排列的意義相同)。

0000

0001

0002

0003

…00ff

0100

0101

….01ff….

2. 位址是什麼?

變數的位址指的實際就是儲存變數資料的記憶體節點序號。

int a = 10;    //int 占用4個位元組

printf("&a = %08x\n", &a); //列印a的位址 008df70c

非常簡單的一段**,列印變數a的位址,008df70c就是記憶體位址,也是存放資料的起始位置(記憶體序號),數值10就儲存在008df70c~008df70f(共4個位元組的記憶體空間),從下圖就能直觀的看出變數和位址的關係。

圖中(藍色)選中部分的數值0000000a,就是a的數值10的十六進製制表示。前面7個0是因為儲存的數值過小,資料高位被0填充。

3. 指標是什麼?為什麼說指標就是位址?兩者之間的關係是什麼?

指標也是變數,不過是與普通的資料型別(int, long, float, double等)不同的變數,因為指標的值記錄的是相同型別變數的位址(記憶體序號)。

int a = 10;     //int 占用4個位元組

printf("&a = %08x\n", &a); //列印a的位址005df740

int*p = &a; //讓int

*型別的指標p指向int型別變數a的位址

printf("*p = %08x\n", *p); //列印指標p指向的值,10

printf("p = %08x\n", p); //列印指標p指向的位址,005df740

printf("&p = %08x\n", &p); //列印p的位址,005df734

**中定義int型別指標p,初始化指向變數a的位址,並列印p指向位址的值,p的值,以及p的位址。結合下圖,可以看出,p的值與a的位址相同(廢話,初始化**都已經知道了 v_v),通過下圖可以看出p和&a是同乙個位址空間005df740,記錄的值是10。

既然說指標也是變數,指標的位址記錄的是什麼呢?一起接著看下面這張截圖。

圖中,檢視p的位址(&p),在005df734~005df737的位址(記憶體序號)中保留的數值經過高低位轉換(40 f7 5d 00 ->005df740),正是變數a的位址。由此可見,指標是記錄記憶體位址的「特殊」變數

指標就是位址,其實是指平時使用指標過程中,指標變數記錄的就是位址,如例子中的int指標p,直接列印的結果就是指向a的位址,如果想獲得指向位址的值,需要使用*。

指標指向一塊儲存變數的位址。

仔細看圖的讀者會發現,指標儲存空間也是4個位元組。可以用sizeof()列印指標的長度確認一下,等長的儲存空間是任意轉換指標型別的基礎。

每個人對c指標的理解都有差別,我希望我的理解能對初學新手帶來一點點幫助。文中有很多漏洞和不足,望大家提出。

C 指標的理解

一.c 位址指標的基本概念在計算機中,所有的資料都是存放在儲存器中的。一般把儲存器中的乙個位元組稱為乙個記憶體單元,不同的資料型別所占用的記憶體單元數不等,如整型量佔2個單元,字元量佔1個單元等,在前面已有詳細的介紹。為了正確地訪問這些記憶體單元,必須為每個記憶體單元編上號。根據乙個記憶體單元的編號...

理解C 的指標

本文是新手零基礎學習c 對指標 陣列和結構的理解和筆記,有些凌亂和語無倫次,只是將想法記錄下來,在以後忘了或者概念不清的時候看看。如理解有誤,敬請各位請前輩不吝指教,不勝感激。在c 基礎教程中指標一般被定義為 存放位址的變數。我們可以把指標變數看做乙個向量,它有大小 sizeof 運算子可查位元組 ...

c指標的理解

指標,將某個變數值賦值給指標,實際上就是將這個變數的位址賦值給指標,或者反過來說,指標中儲存了這個變數的記憶體位址,指向了這個變數,通過指標就能找到這個變數。結構體 記憶體對齊 struct data1 struct data2data1佔8位元組,data2佔12位元組,因為data2中b占用了第...