2012-04-11 107 views

回答

9

指針在C是T*其中T是類型指向類型; void*是泛型指針類型。通常,你讓C隱含地將void*轉換爲有用的東西,例如

char *buffer = malloc(1024); 

ptrdiff_t是由兩個指針,例如的減法返回的類型

ptrdiff_t d = write_ptr - buffer; 
// now you know the write_ptr is d bytes beyond the start of the buffer 

ptrdiff_t是一個整數類型,不是指針類型;你不能在其上使用間接運算符*。 (順便說一句,你也不能在void*上有效地使用它。)

如果你想存儲一個整型指針,uintptr_t本來是合適的。

3

聲明指針的最好方式是

T *ptr; 

其中T是被指向到基本類型 - intcharstruct foo,不管。 malloc返回void *,這是隱式轉換爲目標指針類型,因此所有的以下的同樣有效:

char *str = malloc(512);      // allocates space for 512 chars 
int *arr = malloc(sizeof *arr * 512);   // allocates space for 512 ints 
struct foo *farr = malloc(sizeof *farr * 512); // allocates space for 512 struct foos 
int (*arr2)[10] = malloc (sizeof *arr2 * 512); // allocates space for 512x10 ints 

等等等等等等

沒有指針C中的數據類型;有多個「指向T」的數據類型。指針運算取決於基類型; str + 1將從arr + 1產生不同的值,這將farr + 1產生不同的值等void *是「通用的」指針類型,但你不知道使用通用指針的一切。

不要將指針類型隱藏在typedefs後面,除非指針類型意味着不透明並且從不解除引用,即使這樣通常也是一個壞主意。

+0

+1對於最後一個段落 – 2012-04-11 15:20:45