我应该使用哪种类型的指针? ptrdiff_t还是void *?

时间:2012-04-11 15:00:12

标签: c pointers c89

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

typedef ptrdiff_t pointer; // pointers are ptrdiff_t.

          -- or --

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


pointer ptr = malloc(1024);

2 个答案:

答案 0 :(得分: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就是合适的。

答案 1 :(得分: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 *是“通用”指针类型,但您不会希望使用通用指针。

不要将指针类型隐藏在typedef,之后,除非指针类型是不透明的并且永远不会被解除引用,即使这样,它通常也是一个坏主意。