2009-08-30 11 views
4

の両方を使用してアドレスの取得:考えてみましょ角括弧とアンパサンド

int a[2] = {0,1}; 
int *address_of_second = (&a[1]); 

私はそれが& *(A + 1)に変換されますので、この作品と仮定して、&及び*は互いに打ち消し合うが、私はすることができますそれを数えるか、それともコンパイラ固有ですか?つまり、C標準にはこれについて何か言いたいことがありますか?

これはまともな方法ですか? 個人的に私が書くことを考える:

int *address_of_second = a+1 

が優れている、あなたは同意しますか?

ありがとうございました。

答えて

9

最初のコード例で動作をカウントできます。

私はそれが & *(A + 1)に変換し、その後& と*互いに打ち消しているため、それが動作すると仮定し、私はそれを頼り ことができ、またはそれは、特定の のコンパイラですか?すなわち、標準 はこれについて何か言いたいことがありますか?

a[1]*(a + 1)と同じで、&a[1]はあなたにa + 1で(間接参照、*)int型へのポインタ(&)を与える、&(*(a + 1))と同じです。これは、明確に定義された動作であり、信頼できるものです。

int *address_of_second = a+1

これは読めるが、私の意見では&a[1]ほど読みやすいではありません。 &a[1]は、aがポインタであり、そのポインタのオフセットを参照しており、そのオフセットへのポインタを取得していることを明示しています。 a + 1は、実際の行があなたに何かを教えてくれないという点で少し曖昧です(ですが、そのスニペットで知っている通りです)aはちょうどintになります。

それでも、それは私の意見です。彼らのシーンの背後には、彼らが最低レベルで同じであることを理解している限り、自分のスタイルの決定を自由にすることができます。

+0

合意。マシューのポイントに追加するには:あなたの例では、 'a'は配列なので、&a [1]は「配列aの要素1のアドレス」として簡単に読むことができるので、最初のスタイルが一般的により適しています。私の経験上、配列をポインタとして扱うことは、技術的には正しいものの、混乱を招く可能性があります。 – GrahamS

1

あなたがグループで働くのは、スタイルやコード規約の問題です。どちらの形式もすべての準拠のコンパイラでC++互換です。

私は前者を好きです。

1

どちらも機能します。私の個人的な好みは&(a[1])またはa+1です。私が最初にブラケットの配置を好むのは、それが私が何の住所を取っているかを非常に明確にしているからです。私はほとんどの状況でそれを使用する傾向があります。問題のコードが多くのポインタ演算を行っている場合は、2番目の形式を使用することがあります。