4

今日、私はいくつかのソースコード(ソフトウェアフレームワークの使用を説明するサンプルファイルでした)を閲覧し、次のような多くのコードを発見しました。

int* array = new int[10]; // or malloc, who cares. Please, no language wars. This is applicable to both languages
for ( int* ptr = &(array[0]); ptr <= &(array[9]); ptr++ )
{
   ...
}

つまり、基本的に、彼らは「アドレスにあるオブジェクトのアドレスを取得する」ことを実行しましたarray + x

array + 0通常、これは、書くことやarray + 9直接同じことをするので、明らかに愚かだと思います。私はいつもそのようなコードをsize_tforループに書き直しますが、それはスタイルの問題です。

しかし、これを使いすぎると、私は考えました。露骨に明白な何か、または言語の暗い隅に微妙に隠された何かが欠けているのでしょうか。

元のソースコードを見てみたい人は、それが厄介なものgotomallocあり、もちろんこのポインタのことも含めて、オンラインで気軽に見てください

4

5 に答える 5

5

ええ、最初のものには正当な理由はありません。これはまったく同じことです。

int *ptr = array;

私は2番目にも同意します。

ptr < (array + 10)

もちろんfor、0から9までのループにして、配列の先頭を指すように一時ポインターを設定することもできます。

for(int i = 0, *ptr = array; i < 10; ++i, ++ptr)
    /* ... */

ptrもちろん、それはループの本体内で変更されていないことを前提としています。

于 2013-01-08T00:08:04.920 に答える
2

あなたは何も見逃していません、彼らは同じことを意味します。

しかし、これをもう少し明らかにするために、わかりやすくするために、そのような表現も時々書いていると言わなければなりません。

私は個人的にオブジェクト指向プログラミングの観点から考える傾向があります。つまり、 「配列の開始アドレスからのthオフセットn」ではなく、「配列のth要素のアドレス」を参照することを好みます。nCではこれら2つのことは同等ですが、コードを書いているときは前者を念頭に置いているので、それを表現します。

おそらくそれはこれを書いた人の推論でもあります。

于 2013-01-08T00:29:23.267 に答える
1

編集:これは部分的に正しくありません。コメントを読んでください。


の問題は、間接参照を伴う&(array[0])拡張に拡張されることです。&(*(array + 0))これで、すべてのコンパイラは明らかにこれをと同じものに最適化しますarray + 0が、言語に関する限り、間接参照により、array + 0そうでない場所でUBが発生する可能性があります。

于 2013-01-08T00:10:00.407 に答える
1

彼らがこのように書いた理由は

&(array[0])

&(array[9])

似ているだけです。別の方法はそれを書くことです

array + 0

array + 9

それぞれ。すでに述べたように、それらは本質的に同じことをします(少なくともほとんどのコンパイラーはそれを同じものとして扱います、私は願っています)。

2つの異なるタイプの式を異なる方法で解釈できます。最初の式は「要素0/9のアドレス」として読み取ることができます。2つ目は、「要素オフセットが0/9の配列ポインタ」と読み取ることができます。最初のものはより高レベルに聞こえ、2番目はより低レベルに聞こえます。ただし、ほとんどの人は2番目の形式を使用する傾向があります。

array + 0もちろん、と同じなので、arrayと書くだけで済みますarray。ここでのポイントは、ループの開始と終了が互いに「類似」しているように見えることだと思います。個人的な趣味の問題。

于 2013-01-08T00:10:09.717 に答える
1

古典的な数学によると:

Array[n]

配列 のn番目の要素を参照します。

n番目の要素の「アドレスを取得」するには、 &oraddress of演算子を適用します。

  &Array[n]  

想定されるあいまいさを解消するために、括弧が追加されています。

  &(Array[n])  

読者にとって、左から右に読むと、この式には次の意味があり
ます。位置'n'にある要素のアドレスを返します。

この保険は、古い欠陥のあるコンパイラに対する保護として開発された可能性があります。

一部の人々はそれをより読みやすいと考えています:

  Array + n  

申し訳ありませんが、私は古い学校で、「&」バージョンを使用することを好みます。どのバージョンのコンパイルに時間がかかるか、またはどのバージョンがより効率的かを心配するよりも、コードを読みやすくするために時間を無駄にします。

明確にコメントされたコードのセクションは、効率を高めるためにマイクロ最適化されたコードのセクションや、言語以外の弁護士にはなじみのない言語のセクションを使用するコードのセクションよりも投資収益率が高くなります。

于 2013-01-08T01:36:37.297 に答える