ポインタを定義するための正しい(最良の)方法はどれですか?
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
2 つのポインターの減算によって返される型です。
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
などなどなど。
Cにはシングルポインタデータ型はありません。複数の「ポインタT
」データ型があります。ポインタ演算は基本タイプによって異なります。str + 1
とは異なる値を生成しますarr + 1
。これは、とは異なる値を生成しますfarr + 1
。など は「ジェネリック」ポインタ型ですが、すべてにジェネリックポインタを使用する void *
必要はありません。
ポインタ型が不透明で逆参照されないように意図されている場合を除いて、 typedefの背後にポインタ型を隠さないでください。それでも通常は悪い考えです。