指針(類(lèi)型+地址)
指針就是類(lèi)型+地址


指針=(int*)進(jìn)程的虛擬地址? ? ?這里的int*表示強(qiáng)制轉(zhuǎn)換整數(shù)為int虛擬內(nèi)存地址的常量指針
在c語(yǔ)言中,為了表示指針變量和它所指向變量之間的聯(lián)系,用“*”表示指向。
例如:
int i,*ptr1;
ptr1=&i;
*ptr1=100;/*把100存入ptr所指向的變量i中*/
等同于:i=100;
又如:
char ch,*ptr2;
ptr2=&ch;
*ptr2+=32;/*把ptr2所指向變量ch中的值加32*/
相當(dāng)于:ch+=32;
ch=*ptr2;相當(dāng)于:ch=i;
應(yīng)當(dāng)注意的是,在變量聲明中的“*”和表達(dá)式中的“*”意義是不一樣的,變量聲明中的“*”意味著定義一個(gè)存放指針的指針變量,而表達(dá)式中的“*”表示間接存取指針變量里的指針?biāo)赶蜃兞康闹?。在編程序是?jīng)常用到。
mov 的第 1 操作數(shù)表示傳輸“源”,第 2 操作數(shù)表示傳輸“目標(biāo)”。例如“mov 內(nèi)存 , 寄存
器”表示將內(nèi)存中的值加載到寄存器。
實(shí)際在編寫(xiě)指令時(shí),還需要根據(jù)所傳輸?shù)臄?shù)據(jù)的大小添加助記符后綴。例如將 32 位寬的立
即數(shù) 105000 加載到 eax 寄存器時(shí),要加上后綴 l,寫(xiě)成下面這樣。
movl $105000, %eax
將寄存器 ecx 中的值轉(zhuǎn)移到 eax 寄存器的寫(xiě)法如下所示。
movl %ecx, %eax
最后,將 ecx 寄存器中的數(shù)據(jù)作為地址訪問(wèn)內(nèi)存,并將內(nèi)存上的數(shù)據(jù)加載到 eax 寄存器中
的寫(xiě)法如下所示。
movl (%ecx), %eax
不習(xí)慣匯編的話會(huì)覺(jué)得 %ecx 和 (%ecx) 的區(qū)別難以理解,可以把它當(dāng)作 C 語(yǔ)言的指針。
指針變量 ptr 自身的值等同于 %ecx 的話,那么對(duì)指針的取值操作 *ptr 就相當(dāng)于 (%ecx)。
另外,%ecx 是訪問(wèn)寄存器,而 (%ecx) 則是利用寄存器訪問(wèn)內(nèi)存。
C 語(yǔ)言的指針就是保存虛擬地址的數(shù)據(jù)類(lèi)型。例如將整數(shù) 15000 強(qiáng)制轉(zhuǎn)換為 char* 類(lèi)型并
訪問(wèn),就能夠得到該進(jìn)程的地址空間中 15000 地址上的值。
如果下面出現(xiàn)b = a;那么它就會(huì)根據(jù)符號(hào)表找到變量的真正的物理位置,取得它的值,賦給b。
我們?cè)俣x一個(gè)變量 a 時(shí),變量 a 本質(zhì)上代表一個(gè)存儲(chǔ)單元,CPU通過(guò)該存儲(chǔ)單元的地址訪問(wèn)該存儲(chǔ)單元中的數(shù)據(jù)。所以a本來(lái)代表兩個(gè)值:存儲(chǔ)單元的地址和儲(chǔ)單元中的數(shù)據(jù)。于是就有了二異性。為了消除這種二義性,a存儲(chǔ)單元中的數(shù)據(jù)可以是一個(gè)普通數(shù)值,也可以是另一個(gè)存儲(chǔ)單元的地址,比如:a = &b; 語(yǔ)句就是將b的存儲(chǔ)單元的地址存入a存儲(chǔ)單元中。
