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*T指す型です。void*汎用ポインター型です。通常、C を暗黙のうちにvoid*有用なものに変換させます。

char *buffer = malloc(1024);

ptrdiff_t2 つのポインターの減算によって返される型です。

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適切でした。

于 2012-04-11T15:01:42.797 に答える
3

ポインタを宣言する最良の方法は

T *ptr;

ここで、Tポイントされている基本タイプは- int、、、、何でもです。 を返します。これは暗黙的にターゲットポインタタイプに変換されるため、次のすべてが等しく有効です。charstruct foomallocvoid *

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の背後にポインタ型を隠さないでください。それでも通常は悪い考えです。

于 2012-04-11T15:18:12.417 に答える