0

ポインタを使用して2次元配列を処理するのは良い考えですか?

for( p = &a[0][0]; p < &a[N][N]; p++){
    *p = 0;
}

それとも、インデックスを使用する方が良いですか?

4

3 に答える 3

4

配列を指定した方法は、ポインター演算が常に機能することを保証するものではありません。2次元配列をどのように宣言したかを考えると、それはおそらく問題ではありませんが、確かに良いスタイルではありません。

ただし、代わりに配列が動的に割り当てられると想像してください。このようなもの:

int **p = malloc(ARR_SIZE * sizeof(*p));
for (i = 0; i < ARR_SIZE; i++) {
    p[i] = malloc(ARR_SIZE * sizeof(**p));
}

これは(ある種の)2次元配列ですが、割り当てられたメモリが連続していることを保証するものではないため、ループが中断されます。

于 2013-01-24T22:55:35.300 に答える
2

自分が何をしているのかを完全に理解していて、配列にインデックスを使用したくない非常に正当な理由がある場合を除いて、常にインデックスを使用する必要があります。

理解と保守がはるかに簡単です。他の誰かがあなたのコードを見ている場合、それは彼らにとってより簡単であり、またそれはエラーに対してより耐性があります。ポインタは素晴らしいものですが、多くの人がポインタを間違った方法で使用して悪用しているため、プログラムの理解、維持、バグの発見と解決が困難になっています。私の専門的な経験から、本当に必要であり、自分が何をしているのかを確実に理解している場合を除いて、ポインタを使用して「魔法」を作成しない方がはるかに優れています。

于 2013-01-24T22:51:16.073 に答える
0

いいえ、データが連続して保存されない可能性があるためではありません(上記のコードは、行の最初の要素が前の行の最後の要素の直後から始まることを前提としています)。

于 2013-01-24T22:56:13.457 に答える