D編程指針是很容易和有趣學(xué)習(xí)。一些D編程任務(wù)的指針進(jìn)行更容易和其他D編程任務(wù),如動(dòng)態(tài)存儲(chǔ)器分配,不能沒(méi)有它們來(lái)執(zhí)行。一個(gè)簡(jiǎn)單的指針如下所示。
而不是直接指向變量一樣,指針?biāo)赶虻闹蒂x給變量的地址。正如你所知道的每個(gè)變量是一個(gè)內(nèi)存位置和每個(gè)存儲(chǔ)單元都有其定義的地址,可以使用符號(hào)來(lái)訪(fǎng)問(wèn)(&)運(yùn)算,是指在存儲(chǔ)器中的地址。認(rèn)為這將打印中定義的變量的地址如下:
import std.stdio; void main () { int var1; writeln("Address of var1 variable: ",&var1); char var2[10]; writeln("Address of var2 variable: ",&var2); }
當(dāng)上面的代碼被編譯并執(zhí)行,它會(huì)產(chǎn)生什么結(jié)果如下:
Address of var1 variable: 7FFF52691928 Address of var2 variable: 7FFF52691930
指針是一個(gè)變量,它的值是另一個(gè)變量的地址。如同任何變量或常量,必須聲明一個(gè)指針,然后才能使用它。一個(gè)指針變量聲明的一般形式是:
type *var-name;
其中,type是指針的基本類(lèi)型;它必須是一個(gè)有效的編程類(lèi)型和var-name是指針變量的名稱(chēng)。用來(lái)聲明一個(gè)指針的星號(hào)是用于乘法相同的星號(hào)。然而,在這個(gè)語(yǔ)句中的星號(hào)是被用來(lái)指定一個(gè)變量的指針。以下是有效的指針聲明:
int *ip; // yiibaier to an integer double *dp; // yiibaier to a double float *fp; // yiibaier to a float char *ch // yiibaier to character
所有指針的值的實(shí)際數(shù)據(jù)類(lèi)型,整數(shù),浮點(diǎn)數(shù),字符,或以其他方式是否是相同的,代表一個(gè)內(nèi)存地址的十六進(jìn)制數(shù)。不同數(shù)據(jù)類(lèi)型的指針之間的唯一區(qū)別是變量或常數(shù),該指針指向的數(shù)據(jù)類(lèi)型。
有幾個(gè)重要的業(yè)務(wù),我們將與指針做的非常頻繁。 (a)我們定義一個(gè)指針變量(b)分配一個(gè)變量的地址的指針(c)在指針變量中可用的地址最終進(jìn)入的值。這是通過(guò)使用一元運(yùn)算符*,返回位于其操作數(shù)指定的地址變量的值來(lái)完成。下面的示例使用這些操作:
import std.stdio; void main () { int var = 20; // actual variable declaration. int *ip; // yiibaier variable ip = &var; // store address of var in yiibaier variable writeln("Value of var variable: ",var); writeln("Address stored in ip variable: ",ip); writeln("Value of *ip variable: ",*ip); }
當(dāng)上面的代碼被編譯并執(zhí)行,它會(huì)產(chǎn)生什么結(jié)果如下:
Value of var variable: 20 Address stored in ip variable: 7FFF5FB7E930 Value of *ip variable: 20
它始終是一個(gè)好習(xí)慣,對(duì)NULL指針?lè)峙浣o案件的指針變量你沒(méi)有確切的地址進(jìn)行分配。這樣做是在變量聲明的時(shí)候。分配空指針被稱(chēng)為空指針(null)。
空指針是一個(gè)常數(shù)為零的幾個(gè)標(biāo)準(zhǔn)庫(kù),包括iostream中定義的值??紤]下面的程序:
import std.stdio; void main () { int *ptr = null; writeln("The value of ptr is " , ptr) ; }
讓我們編譯和運(yùn)行上面的程序,這將產(chǎn)生以下結(jié)果:
The value of ptr is null
在大多數(shù)的操作系統(tǒng),程序不允許在地址0訪(fǎng)問(wèn)內(nèi)存,因?yàn)閮?nèi)存是??由操作系統(tǒng)保留。然而,存儲(chǔ)器地址0具有特殊的意義;它表明,該指針不旨在指向一個(gè)可訪(fǎng)問(wèn)的存儲(chǔ)器位置。但按照慣例,如果一個(gè)指針包含空(零)值,它被假定為不指向什么東西。
要檢查空指針,可以使用一個(gè)if語(yǔ)句如下:
if(ptr) // succeeds if p is not null if(!ptr) // succeeds if p is null
因此,如果所有未使用的指針被賦予空值,并且避免使用空指針,能避免未初始化的指針的意外誤操作。很多時(shí)候,未初始化的變量舉行一些垃圾值,就很難調(diào)試程序。
可以對(duì)指針的使用加減乘除四則運(yùn)算符: ++, --, +, -
為了理解指針的算術(shù)運(yùn)算,讓我們認(rèn)為,ptr是一個(gè)整數(shù)的指針,假設(shè)它32位指向的地址1000整數(shù),讓我們上的指針執(zhí)行以下算術(shù)運(yùn)算:
ptr++
ptr將指向位置1004,因?yàn)槊看蝡tr遞增,它會(huì)指向下一個(gè)整數(shù)。此操作將指針移動(dòng)到下一個(gè)內(nèi)存位置,而不在內(nèi)存中的位置影響實(shí)際值。如果ptr指向一個(gè)字符的地址是1000,那么上面的操作將指向位置1001,因?yàn)橄乱粋€(gè)字符將在1001。
我們優(yōu)選使用在我們的程序,而不是一個(gè)數(shù)組的指針,因?yàn)樽兞恐羔樋梢赃f增,這是不能被增加,因?yàn)樗且粋€(gè)常量指針數(shù)組名不同。下面的程序?qū)⒆兞恐羔榿?lái)訪(fǎng)問(wèn)數(shù)組中的每個(gè)元素成功:
import std.stdio; const int MAX = 3; void main () { int var[MAX] = [10, 100, 200]; int *ptr = &var[0]; for (int i = 0; i < MAX; i++, ptr++) { writeln("Address of var[" , i , "] = ",ptr); writeln("Value of var[" , i , "] = ",*ptr); } }
當(dāng)上面的代碼被編譯并執(zhí)行,它會(huì)產(chǎn)生一些結(jié)果如下:
Address of var[0] = 18FDBC Value of var[0] = 10 Address of var[1] = 18FDC0 Value of var[1] = 100 Address of var[2] = 18FDC4 Value of var[2] = 200
指針和數(shù)組有很大的關(guān)系。然而,指針和數(shù)組不完