1、指針概念
指針在匯編語言中指的就是間接尋址亿柑,用途是訪問一片匿名的動態(tài)內(nèi)存
在不同操作系統(tǒng)中指針大小結(jié)論
(1)在32位操作系統(tǒng)下,指針是占4個字節(jié)空間大小痕支,不管是什么數(shù)據(jù)類型
(2)在64位操作系統(tǒng)下卧须,指針是占8個字節(jié)空間大小花嘶,不管是什么數(shù)據(jù)類型
往內(nèi)存 0x12ff7c 地址上存入一個整型數(shù) 0x100:int *p = (int *)0x12ff7c;
*p = 0x100;
2椭员、以指針的形式訪問和以下標(biāo)的形式訪問
A),char *p = “abcdef”;p 本身在棧上占 4 個 byte,p 里存儲的是一塊內(nèi)存的首地址闸度。這塊內(nèi)存在靜態(tài)區(qū)莺禁,其空間大小為 7 個 byte哟冬,這塊內(nèi)存也沒有名字浩峡。對這塊內(nèi)存的訪問完全是匿名的訪問翰灾。
假如要取e的值平斩,1)以指針的形式:*(p+4)绘面。先取出 p 里存儲的地址值揭璃,假設(shè)為 0x0000FF00塘辅,然后加
上 4 個字符的偏移量,得到新的地址 0x0000FF04扛吞。然后取出 0x0000FF04 地址上的值滥比。
2)以下標(biāo)的形式:p[4]。p[4]這個操作會被解析成:先取出 p 里存儲的地址值键耕,然后加上中括號中 4 個元素的偏移量村视,計算出新的地址蚁孔,然后從新的地址中取出值杠氢。以下標(biāo)的形式訪問在本質(zhì)上與以指針的形式訪問沒有區(qū)別鼻百,只是寫法上不同玻靡。
B),char a[] = “123456”;對 a 的元素的訪問必須先根據(jù)數(shù)組的名字 a 找到數(shù)組首元素的首地址囤捻,然后根據(jù)偏移量找到相應(yīng)的值。這是一種典型的“具名+匿名”訪問誊涯。
若需要讀取字符‘5’暴构,
1)以指針的形式:*(a+4)取逾。a 這時候代表的是數(shù)組首元素的首地址砾隅,假設(shè)為 0x0000FF00,然后加上 4 個字符的偏移量儒洛,得到新的地址 0x0000FF04晶丘。然后取出 0x0000FF04 地址上的值浅浮。
2)以下標(biāo)的形式:a[4]滚秩。編譯器總是把以下標(biāo)的形式的操作解析為以指針的形式的操作郁油。a[4]這個操作會被解析成:a 作為數(shù)組首元素的首地址桐腌,然后加上中括號中 4 個元素的偏移量案站,計算出新的地址承边,然后從新的地址中取出值博助。
指針和數(shù)組都可以“以指針形式”或“以下標(biāo)形式”進(jìn)行訪問富岳。
對于使用malloc()函數(shù)申請的堆內(nèi)存城瞎,是動態(tài)變化的且是匿名內(nèi)存,只能借助指針來訪問狼电。
3肩碟、指針運算
不同的指針類型會有不同的運算操作。
3.1 指針與常數(shù)相加
P++相當(dāng)于數(shù)值運算中的p+1*sizeof(type)髓抑;P++總是指向下一個元素的地址吨拍。
3.2 指針與指針相減
指針與指針相加減的前提是兩個指針類型要一致羹饰,而且只能相減笑旺,不能相加燥撞,相減的結(jié)果表示兩個指針在內(nèi)存中的距離物舒。兩個指針相減的結(jié)果以數(shù)據(jù)類型的長度sizeof(type)為單位冠胯,而非以字節(jié)為單位。