指標有兩個屬性:指向變數/對象的地址和長度 但是指標只儲存地址,長度則取決於指標的類型
編譯器根據指標的類型從指標指向的地址向後定址 指標類型不同則定址範圍也不同,
例如:
int*從指定地址向後尋找4位元組作為變數的儲存單元
double*從指定地址向後尋找8位元組作為變數的儲存單元
void幾乎只有“注釋”和限制程式的作用
void真正發揮的作用在於:
(1) 對函數返回的限定;
(2) 對函數參數的限定
下面有使用void的規則:
規則一 如果函數沒有傳回值,那麼應聲明為void類型
規則二 如果函數無參數,那麼應聲明其參數為void
規則三 小心使用void指標
按照ANSI(American National Standards Institute)標準,不能對void指標進行演算法操作,即下列操作都是不合法的:
ANSI標準之所以這樣認定,是因為它堅持:進行演算法操作的指標必須是確定知道其指向資料類型大小的。
void * pvoid;
pvoid++; //ANSI:錯誤
pvoid += 1; //ANSI:錯誤
int *pint;
pint++; //ANSI:正確
規則四 如果函數的參數可以是任意類型指標,那麼應聲明其參數為void *
典型的如記憶體操作函數memcpy和memset的函數原型分別為:
void * memcpy(void *dest, const void *src, size_t len);
void * memset ( void * buffer, int c, size_t num );
任何類型的指標都可以傳入memcpy和memset中,這也真實地體現了記憶體操作函數的意義,因為它操作的對象僅僅是一片記憶體,而不論這片記憶體是什麼類型。如果memcpy和memset的參數類型不是void *,
規則五 void不能代表一個真實的變數
void的出現只是為了一種抽象的需要,如果你正確地理解了物件導向中“抽象基類”的概念,也很容易理解void資料類型。正如不能給抽象基類定義一個執行個體,我們也不能定義一個void(讓我們類比的稱void為“抽象資料類型”)變數。
下面解釋一個概念,雖然在漢語中void pointer和null pointer都翻譯為空白指標,但是其是有區別的。
NULL Pointer:
NULL pointer不指向任何實際實體記憶體地址
The concept of NULL pointer is different from the above concept of void pointer.
NULL pointer is a type of pointer of any data type and generally takes a value as zero.
This is, however, not mandatory. This denotes that NULL pointer does not point to any valid memory address.
For example:
int* exforsys;
exforsys=0;
The above statement denotes exforsys as an integer pointer type that does not point to a valid memory address. This shows that exforsys has a NULL pointer value.
The difference between void pointers and NULL pointers:
A Void pointer is a special type of pointer of void and denotes that it can point to any data type.
NULL pointers can take any pointer type, but do not point to any valid reference or memory address.
NULL pointer和未初始化指標是有區別的:(下面是例子)
It is important to note that a NULL pointer is different from a pointer that is not initialized.
For example, if a programmer uses the program below:
#include <iostream.h>
int *exforsys;
void main()
{
*exforsys=100;
}
The output of the above program is
NULL POINTER ASSIGNMENT
The above program will result in a runtime error.
This means that the pointer variable exforsys is not assigned any valid address and, therefore, attempting to access the address 0 gives the above error message.