3

ポインターは非常に多くのことに役立つため、特定のコード行でポインターが何を意味するのか理解できない場合があります。
たとえば、一連の要素を表すためにポインターを使用することがあります。

char* char_array = "abcd";
int* int_array = malloc(5 * sizeof(*int_array));

また、ポインターを使用して、ヒープに単一のオブジェクトを割り当てたり、ある要素から別の要素を指すようにしたりすることもあります。

int a = 5;
int* int_ptr = &a;
struct item* an_item = malloc(sizeof(*an_item));

両方が衝突を使用すると、連続するポインターが読み取れなくなります。

    struct cell** board;
 // Does this represent a succession of cell allocated on the heap,
 // a succession of pointers to uniques cells (like an array),
 // a succession of pointers to multiples cells (like a two dimensional array)?

 // Of course the more you add pointers the more it becomes confusing.
    struct cell*** board;

or マクロを使用typedefして、参照または malloc されたものとして使用されるポインターを表す型を作成することを考えました。
場合によっては読みやすさが向上するため、これは諸刃の剣になる可能性がありますが、コードを難読化することにもなります。
ポインターの意味が理解しやすいコードを作成するには、どのような方法をお勧めしますか?

4

3 に答える 3

1

ポインタの意味は常に同じです。実際には常に単一のオブジェクトのみを指しています。したがって、ポインタはメモリ内の単一の場所を指す変数です


あなたのさまざまな例については

あなたが何かをするとき

char* char_array = "abcd";
int* int_array = malloc(5 * sizeof(*int_array));

この場合も、ポインターはstring 全体の単一の をchar_array指しています。初期化の方法 (文字列リテラル) が原因で、次のメモリ位置に文字が格納されることがあります。chara"abcd"


char_ptr上記の例のポインターは、実際には以下 と同じです

char* char_array = "abcd";
char* char_ptr = char_array;

もしあなたがこのように

printf(" %c", char_ptr);

印刷しますa

あなたが何かをするなら

printf(" %s", char_ptr);

文字列全体を出力します"abcd"

ここでは、ステートメントでchar_ptrどのように行動しているのかもわかりますが、char_arrayprintf()

于 2016-01-31T09:38:03.417 に答える
1

ポインターの意味が理解しやすいコードを作成するには、どのような方法をお勧めしますか?

ポインターの意味が、コードの部外者にとって不明確になる可能性があることは事実です。変数名にプレフィックスを付けて、より意味のあるものにすることをお勧めします。

参照: https://en.wikipedia.org/wiki/Hungarian_notation#Examples

もちろん、この例に詳しく従う必要はありません。接頭辞を付けたり、独自のものを作成したりする方法は複数あります。どこかで説明すれば大丈夫です。

于 2016-01-31T09:52:35.633 に答える
0

これはコード スタイルに関することが多いため、異なる答えが存在する可能性があり、それらはすべて正しい可能性がありますが、必要に応じて異なるスタイル (または視点) を提示します。

私のアドバイスは、2 * を超えないようにすることです。そして、私の C コーディングをよく覚えていれば、2 つの * を void ** 型にのみ使用しました。

それ以外の場合はすべて、(マクロではなく) typedef を使用し、オブジェクトの適切な構造を作成してください。

typedef を使用して、各レベルの名前を作成します。したがって、タイプ CELL で開始し、これらの配列が必要な場合は、たとえば CELL_LIST と呼びます。これは、CELL (へのポインター) の配列になります。CELL_LIST の配列が必要ですか? たとえば、BOARD という名前を付けます。

したがって、CELL_LIST は CELL へのポインタです。BOARD は CELL_LIST へのポインターです (ROW という名前でもかまいません)。別の次元が必要ですか?BOARD_LIST または BOARD_3D と呼びます...

于 2016-01-31T09:49:14.680 に答える