c語言要玩的好,指標是核心,但是指標在學習的時候看教程往往感覺一看就明白,但是實際用的時候一用就錯,而且還不知道錯在哪。為了更加深刻的了解指標,將學習過程記錄下來,依次加深對指標的理解。
先看看一段測試**
void fun(void)
int main(void)
}
定義乙個變數a,值為100,然後定義乙個一級指標p1,p1指向a,然後定義乙個二級指標p2,p2指向p1,在定義乙個**指標p3,p3指向p2。
對應關係如下:
然後列印出變數a的值和指標最終對應的值,在列印出變數的位址。通過在keil中單步除錯觀察這幾個變數。
通過串列埠輸出結果為:
由keil中觀察變數的值,和輸出結果可以看出變數a的位址為 0x20000758,一級指標p1的位址為 0x20000754,二級指標p2的位址為 0x20000750,**指標p3的位址為 0x2000074c。知道了變數的位址,那麼指標的對映關係為:
通過這個對應關係可以很清晰的看出,a中儲存的是變數100,p1中儲存的是a的位址,p2中儲存的是p1的位址,p3中儲存的是p2的位址。將這四個變數的值列印出來,看看是不是和分析的一樣。
printf("a = %#x,p1 = %#x,p2 = %#x,p3 = %#x\r\n", a, p1, p2, p3);
列印結果為:
a的值為0x64也就是10進製的100,p1的值為a的位址0x20000758,p2的值為p1的位址0x20000754,p3的值為p2的位址0x20000750。由此可以看出除了變數a中儲存的是值100外,不管是幾級指標,它裡面儲存的都是它所指向變數的位址。如果要知道指標所指向的是哪個變數,只要列印出指標變數的值,這個值就是它所指向變數的位址。那麼如果要知道指標所指向變數中存的值,那麼就要用到取值運算子*,在指標前面加乙個 * 星號,就代表要取這個指標變數中所儲存位址中的變數。現在給指標變數前加乙個"*"星號,列印出來看來結果。
可以看出 *p1 的值 就是變數a的值100, *p2的值為a的位址 0x20000758, *p3的值為p1的位址0x20000754。
對於多級指標來說,加乙個星號,就會向前查詢一級位址中所對應的值。
這次給指標變數前加兩個星號列印看看。
給二級指標p2前面加兩個星號,列印出來就是變數a的值,給**指標前面加兩個星號,列印出來就是變數a的位址。也就是說指標會向前查詢兩級位址中所儲存的變數值。
下來給指標前面加三個星號。
printf("a = %#x,**p1 = %#x,**p2 = %#x,***p3 = %#x\r\n", a, *p1, **p2, ***p3);
加上三個星號後,列印出來的是變數a的值100。說明加上三個星號後,指標會向前查詢**位址中所儲存的變數值。
通過上面實驗可以更深刻的了解指標,指標變數內儲存的是乙個位址,如果要獲取這個位址就直接呼叫指標變數如:p1;如果要獲取這個位址中存貯的值,就要用取值運算子 「*」 ,如: *p;如果要獲取這個指標變數自己本身的位址,就要用取位址運算子 「&」 ,如:&p1。
指標和普通變數的區別是,普通變數中儲存的數字代表乙個值,而指標變數中儲存的數字是乙個位址。可以理解為,普通變數中的數字就是 快遞包裹中的東西,而指標變數中的數字就是快遞包裹要送去的位址。使用指標時就要清楚的知道自己想要的是是快遞包裹的位址還是想要包裹中的東西。
C語言學習筆記 指標
若觸過組合語言,那麼理解學習c語言中指標就很簡單了。指標,在彙編裡面的表現形式,無非就是定址,直接定址和間接定址。先來學習下,c語言中的4大類資料型別 基本型別 int,long,float,char 構造型別 陣列,結構體 struct,聯合體 union,列舉型別 enum 指標型別 int l...
C語言學習筆記 指標
get新知識 1 指向二維陣列的指標,如指向int a 3 4 的指標int p 4 p指的是第0行第乙個位址 注意是位址 p 1 指的是第1行第乙個位址,以此類推 p i j 表示第i行第j列的元素。二維陣列本質也是一維陣列。每一行相當於乙個元素。2 指向函式的指標 作用 可以作為另乙個函式的引數...
C語言學習 指標 筆記
1 c程式設計中使用指標的好處 2 記憶體中每個位元組都有自己唯一的編號 記憶體位址 3 儲存單元 記憶體位址及指標 4 指標變數 4.1 變數的指標和指向變數的指標變數 其中,用 表示指標變數所指向的物件。如 指標變數pa指向變數a。則 pa就表示pa的物件,即變數a。此時 pa與a為同乙個變數 ...