符號 * 的三種概念:
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...