1

哪一行是定义指针​​的正确(最佳)方式?

typedef ptrdiff_t pointer; // pointers are ptrdiff_t.

          -- or --

typedef void* pointer; // pointers are void*.


pointer ptr = malloc(1024);
4

2 回答 2

9

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将是合适的。

于 2012-04-11T15:01:42.797 回答
3

声明指针的最佳方式是

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.

于 2012-04-11T15:18:12.417 回答