2012-04-11 105 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