哪一行是定义指针的正确(最佳)方式?
typedef ptrdiff_t pointer; // pointers are ptrdiff_t.
-- or --
typedef void* pointer; // pointers are void*.
pointer ptr = malloc(1024);
C 中的指针属于类型T*
whereT
指向的类型;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
是整数类型,不是指针类型;您不能*
在其上使用间接运算符。(顺便说一句,你也不能在 a 上有意义地使用它void*
。)
如果您想以整数类型存储指针,那uintptr_t
将是合适的。
声明指针的最佳方式是
T *ptr;
T
指向的基本类型在哪里-- int
, char
, struct foo
, 等等。 malloc
返回 a 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 *
是“通用”指针类型,但你不想对所有东西都使用通用指针。
Do not hide pointer types behind typedefs, unless the pointer type is meant to be opaque and never dereferenced, and even then it's usually a bad idea.