C語言 指標pointer 與解引用

2021-09-29 04:26:05 字數 2695 閱讀 9440

符號 * 的三種概念:

a = a*b; //乘法 *兩邊都是變數 ->乘法概念 √

int *p ;//識別符號 和 變數之間 => 申明概念 √ //申明了乙個指標p

*p =100; //指向概念 √

指標有三個值,最關係其中兩個值 p和*p

p: 指標p,存放的是a的位址 指向目標的位址

*p: p指向目標的內容

(不常用)

&p:存放的也是位址,是指標的位址

理解:

1. p本身存的是a的位址 位址沒有大小概念 只有高低概念

2. 解引用 * 就像解開盒子的秘密一樣

盒子裡面裝的是a的操作位址 當我解密這個操作位址 我就找到a啦

3.對*p的操作其實就是對a的操作

4.*&p =

>

&a;

問題:

1. 乙個變數可能占有多個位元組 指標指向哪?

32位系統 指標開闢4位元組

指標:指向的是首位址

2. 首位址是哪個呢?

預設指向低位址

3. 既然都只存放4位元組 那為什麼會有double指標 int指標呢?

解釋:指標不存放double或者int型別 主要是以下能力

3-1.對指標的約束能力 :指標+

1能力 不同型別+

1能力不同

3-2.對型別的解釋不同:如何去哪個部分解開這塊記憶體 *p

4. 為什麼指標是4個位元組?

記憶體中有9個通用暫存器:eax ebx ecx edx

esp ebp esi edi eip

在32位作業系統裡面 保護模式 位址暫存器 是32位bit位

從0x 00000000

-0xffffffff

;32位 32bit位 乙個位元組8bit位 所以32位只能拿4位元組編址

所以 指標是4個位元組

5.位址線不是36嗎?

36條位址線 保護模式 只用了32條 訪問32位

實模式 用了36條 此時可以訪問64g

int

main()

;int

*p =

&ar[0]

;for

(int i =

0;i<

6;i++

)

因為是int型別的指標 指標+

1能力:所以陣列記憶體每次+

4 十六進製制

-1 對指標的約束能力 :指標+

1能力 理解:

type *p =

null

;//type可能是任何型別

p = p+n;

=> p = p +

sizeof

(type)

* n;

// 如果是double 那就是 n = 8 每次移動8個位元組

3-2.對型別的解釋不同: 理解

假設這裡了有一塊記憶體,存放如下位址

0001

0000

0110

0000

0000

1100

0110

0000

0100

0000

0010

0000

0010

0001

0001

0001

0001

0100

char

*cp;

char

*ip;

double

*dp

都存放首位址0001

0000

解引用*cp記憶體是	 

0001

0000

解引用*ip的記憶體是

0001

0000

0110

0000

0000

1100

0110

0000

解引用*dp的記憶體是

0001

0000

0110

0000

0000

1100

0110

0000

0100

0000

0010

0000

0010

0001

0001

0001

C語言指標的入門pointer

pointer指標,一般計算機中用乙個16進製制數來表示記憶體位址。通過使用資料型別加 宣告乙個指標變數,指標變數只能用來儲存記憶體位址,用取位址符 i 把變數i的位址取出來 用指標變數pointer 儲存了起來,此時我們可以說 指標pointer指向了 i的位址。include include m...

C 學習隨筆之指標 pointer 初識

資料型別 指標變數名例 int ptr num char ptr name int year year 2016 int ptr year 取位址符 ptr year year 賦值記憶體位址 char ch a char ptr ch ch cout void ptr ch t ptr ch en...

C語言 多級指標 解引用

1.解引用 int main int a 10 int b 20 printf d d n a,b 10 20 int p a p裡儲存a的位址 p 100 對p解引用,將p指向的位址的內容賦為100 p b p指向b p 200 將p指向的位址的內容賦為200 printf d d n a,b 1...