哪一行是定义指针的正确(最佳)方式?
typedef ptrdiff_t pointer; // pointers are ptrdiff_t.
-- or --
typedef void* pointer; // pointers are void*.
pointer ptr = malloc(1024);
答案 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
是指向的基本类型 - 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 *
是“通用”指针类型,但您不会希望使用通用指针。
不要将指针类型隐藏在typedef,之后,除非指针类型是不透明的并且永远不会被解除引用,即使这样,它通常也是一个坏主意。