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