哪一行是定義指針的正確(最佳)方式?我應該使用哪種類型的指針? ptrdiff_t或void *?
typedef ptrdiff_t pointer; // pointers are ptrdiff_t.
-- or --
typedef void* pointer; // pointers are void*.
pointer ptr = malloc(1024);
哪一行是定義指針的正確(最佳)方式?我應該使用哪種類型的指針? ptrdiff_t或void *?
typedef ptrdiff_t pointer; // pointers are ptrdiff_t.
-- or --
typedef void* pointer; // pointers are void*.
pointer ptr = malloc(1024);
指針在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
本來是合適的。
聲明指針的最好方式是
T *ptr;
其中T
是被指向到基本類型 - int
,char
,struct 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後面,除非指針類型意味着不透明並且從不解除引用,即使這樣通常也是一個壞主意。
+1對於最後一個段落 – 2012-04-11 15:20:45
'void * ptr = malloc(1024);':) – Joe 2012-04-11 15:01:10