Какой тип я должен использовать для указателя? ptrdiff_t или void *?

Какая строка является правильным (лучшим) способом определения указателя?

typedef ptrdiff_t pointer; // pointers are ptrdiff_t. -- or -- typedef void* pointer; // pointers are void*. pointer ptr = malloc(1024); 

Указатели в 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 был бы уместным.

Лучшим способом объявления указателя является

 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 

etc., etc., etc.

В C нет единого типа данных указателя; существует несколько типов данных «указатель на T ». Арифметика указателя зависит от базового типа; str + 1 даст другое значение из arr + 1 , что даст другое значение от farr + 1 и т. д. void * – это «общий» тип указателя, но вы не хотите использовать общие указатели для всего.

Не скрывайте типы указателей за typedefs, если только тип указателя не будет непрозрачным и никогда не будет разыменован, и даже тогда это обычно плохая идея.