VB中的指標與指標變數

2021-10-04 18:34:01 字數 3180 閱讀 6166

指標的概念源於c語言,vb沒有指標的概念,但其實物件變數就可以看成是指標:

set a=obj 'a就是指向obj的位址'
dim a as long

dim p as long

p=varptr

(a)

上網查資料也有的說vb指標是有的,只不過被隱藏起來了,因為vb官方不鼓勵使用者使用指標。下面這三個函式配合copymemory這個api函式可以達到和c語言的指標差不多的效果。

private sub form_load()

dim test as long

test =

"123"

debug.print varptr

(test)

'varptr(test)可以得到變數「test」的記憶體位址。'

debug.print strptr

(test)

'strptr(test)可以得到變數「test」中值的記憶體位址,也就是儲存「123」這塊記憶體的位址'

end sub

vb只能通過呼叫copymemory(將一塊記憶體從位置拷貝到另外乙個位置)函式來讀寫指標指向的變數位址。而c能方便高效的讀寫,例如在宣告copymemory以後這樣寫入:

copymemory byval p, byval 123&,

4&

來簡單介紹一下copymemory函式用法:

copymemory是乙個windows api函式,它能將一塊記憶體資料從乙個位置複製到另乙個位置。

函式原型:

copymemory(pvoid destination,const void *source,size_t length)

destination:要複製記憶體塊的目的位址。

source:要複製記憶體塊的源位址。

length:指定要複製記憶體塊的大小,單位為位元組

返回值:該函式為void型,沒有返回值。

private declare sub copymemory lib "kernel32" alias "rtlmovememory"

(byval destination as long, byval source as long, byval length as long)

private sub command1_click()

dim a as long, b as long, m as long

a =1234

'給a賦值為1234'

m =varptr

(a)'獲得a的指標'

msgbox m '顯示指標的數值'

copymemory varptr

(b), m,

4'複製a的記憶體到b的指標處'

msgbox b '顯示b的內容,應該就是1234'

end sub

指標的基本概念:

為了區別記憶體的不同位置,記憶體被分成位元組,記憶體的全部位元組順序地賦予乙個稱為位址的編號。

程式中的變數將在記憶體中佔據一定的記憶體位元組,在這些位元組中儲存的資料資訊稱為變數的內容。

乙個變數占用連續的若干個記憶體位元組時,最前面的乙個位元組的位址就作為該變數的位址。

指標就是記憶體位址,是變數的位址,或函式的入口位址。

變數的位址在程式執行時,起著非常重要的作用。當計算機在計算含有變數的表示式時,計算機按變數的位址取出其內容,並按變數的位址將計算結果存入到變數佔據的記憶體中。例如:

int x=l;  

x=x+2;'取x的內容,完成加上2的計算,並將計算結果存入變數x佔據的記憶體中'

其中語句「x=x+2;」中的第乙個x涉及到變數x佔據的記憶體,第二個 x是引用變數 x的內容。

用例子來看一下。

a=3這個式子先解釋一下,等式右邊是常量,左邊是變數。

同理的p=&a,左邊的是指標變數,右邊的是指標。

int a=3;

int*p;

p=&a;

說白了就是指標只是指向一塊記憶體的首位址,常量是這塊記憶體裡存的東西,不能改變;變數是可以改變記憶體裡存的東西。

指標變數和它所指向的變數:

在c語言中,位址也作為一種值,能被儲存、比較、賦值,並稱位址資料為指標型別,而稱儲存位址值的變數為指標變數,簡稱指標。

c程式可用運算子&取變數的位址,如表示式&x的值就是變數x的位址。程式除能按名引用變數外,也可利用變數的位址引用變數。

直接引用:按變數名引用變數。

間接引用:將變數a的位址存於另一變數b中,借助於變數b引用變數a稱為對a的間接引用。  

定義指標變數的一般形式為:

- 型別 * 指標變數名;   

- 型別 * 指標變數名=初值表示式;

其中,指標變數名是識別符號,指標變數名之前的符號「*」,表示該變數是指標型別的。而最前面的「型別」,表示該指標變數能指向變數或函式的型別。初值表示式是乙個位址表示式,如表示式中有某變數的位址表示式,則這個變數應是前面已定義的。

在c語言中,當定義區域性指標變數時,如未給它指定初值,則其值是不確定的。程式在使用它們時,應首先給它們賦值。誤用其值不確定的指標變數間接引用其它變數,會引起意想不到的錯誤。為明確表示指標變數不指向任何變數,在c語言中用0值表示這種情況,記為null。如:

ip= null

;

也稱指標值為0的指標變數為空指標。對於靜態的指標變數,如在定義時未給它指定初值,系統自動給它指定初值0。

指標變數取程式物件的(開始)位址值,不能將乙個整型量或任何其它非位址值賦給乙個指標變數。另外,指標變數對所指向的物件也有型別限制,不能將乙個不能指向的物件的位址賦給指標變數。如有以下定義:

int i=100,j,*ip,*intpt;  

float f,

*fp;  

以下**如注釋所敘。  

ip=&i;/*使ip指向i*/  

intpt=ip;/*使intpt指向ip所指變數*/  

fp=&f;/*使fp指向正*/  

ip=null;/*使 ip不再指向任何變數*/

指標與指標變數

1 i pointer是乙個指標變數,而 i pointer表示i pointer所指向的變數即i。下面兩個語句作用相同 i 3 i pointer 3 2 定義指標變數 基型別 指標變數名 下面都是合法的定義 float pointer 3 pointer 3是指向單精度型資料的指標變數 char...

c的指標與指標變數

系統為每乙個記憶體單元分配乙個位址值,c c 把這個位址值稱為 指標 如有int i 5 存放變數i的記憶體單元的編號 位址 i被稱為指標。指標變數 則是存放前述 位址值 的變數,也可以表述為,指標變數 是存放變數所佔記憶體空間 首位址 的變數 因為乙個變數通常要占用連續的多個位元組空間 比如在in...

指標與變數

指標變數是一種特殊的變數,它和以前學過的其他型別變數的不同之處是 用它來指向另乙個變數。為了表示指標變數和它所指向的變數之間的聯絡,在c 中用 符號表示指向,例如,i pointer是乙個指標變數,而 i pointer 表示 i pointer 所指向的變數,見圖6.3。下面兩個語句作用相同 c ...