2015-11-11 5 views
6

私はコードの行は、このプログラムの中で何をするかに関しては困惑している:C++では "*(ポインタ+整数)"は何をしますか?

int *temp = new int [cap]; 
int num = 0; 

for(int i = name; i < number; i++) 
{ 
*(temp + count) = *(foo + i); 
num++; 
} 

namenumber、およびfooはグローバル変数(fooがポインタである)、 とcapある引数です。

具体的には、私はこの行を理解していない:

*(temp + count) = *(foo + i); 

は括弧にそこポインタであるなぜ、これは何をしますか?

+6

私はこの質問に対して適切な重複がないとは思えません。 –

+3

これはかなり良い最初の質問ですが、私は無関係の言葉をたくさん編集しました。あなたの元の "余分な情報を許す"という行のように、無関係の情報*ではありません。特に、あなたはあなたがプログラムの特定の行について混乱していると言って始めましたが、あなたの "余分な"情報がなければ、どの行があなたを混乱させたのか分かりませんでした! –

+0

これは、配列インデックスの代替構文です。 –

答えて

1

*(temp + count) = *(foo + i)は意味:

temp[count] = foo[i]; 

次いでアドレスfooからの値にアドレスtemp + countを結果に値を設定し、それにオフセットcountを追加し、tempアドレスを取得するには良いがされるi

をオフセット

(ところで、それはCスタイルではなく(newを除く)、C++ではなく、非常に悪いコードです。

+2

temp [count] = foo [i]と書くのはあいまいな方法です。 – cwallach

+3

それはどちらも "Cスタイル"ではない、それはちょうど悪いです。 –

+1

@cwallach代わりに 'count [temp] = i [foo];'と他の組み合わせ:) – Kevin

9
*(temp + count) = *(foo + i); 

演算子はポインタ演算を実行しています。整数をポインタ値に追加すると、指定された数のオブジェクトが元のポインタよりも増えた新しいポインタが生成されます。たとえば、parr[0]へのポインタである場合、p+2arr[2]を指します。

*演算子結果ポインタが、それが指すオブジェクトを与えます。

実際、配列インデックス演算子[]はポインタ演算で定義されているため、A[i]*(A+i)を意味します(演算子のオーバーロードは無視されます)。したがって、上記のコードの行:として

*(temp + count) = *(foo + i); 

も書くことができます(より明確に私見):

temp[count] = foo[i]; 

あなたが特にcomp.lang.c FAQ、セクション4(ポインタ)および6(配列を読みたいと思うかもしれませんおよびポインタ)。ほとんどの情報はC++にも適用されます。

しかし、では、C++は、低レベルのC同等物よりも堅牢性の高い高レベルのライブラリインターフェイスを提供します。非常に低レベルのコードであり、パフォーマンスが重要でない、あるいはCコードからのデータ構造を扱っていない限り、配列要素への配列とポインタを直接扱うコードを書くことは、C++ではめったにありません。あなたの例では

2

*(temp + count) = *(foo + i); 

temp[count] = foo[i]; 

表現*(temp + count)と同等ですtempをポインタに整数countを追加して、配列内の位置countの要素にあなたにポインタを与えることで指さtempおよびdereferencesです。

0

おそらく、あなたの質問の主要行は、次のとおりです。

なぜ括弧へのポインタは、[...]がありますか?

CおよびC++の*シンボルは、多少混乱して意味的に過負荷になります。 *が「int_ptr」という意味ののように、「ポインタへのポインタ」を意味することは間違いありません。の*の型へのポインタです。

しかし、でもは、実際にここで起こっていることである "へのポインタの逆参照"を意味します。ポインター値にint型の型を追加すると、ポインタ型の値のオフセット型になります(つまり、ある程度の距離のメモリアドレスを計算しているため)(temp + count)(foo + i)の式はポインタ-sに評価されます。元のポインタ)。かっこは、*が適用される前に追加操作が行われることを保証するだけです。したがって、*(temp + count)逆参照のポインタ値temp + countです。これは、アドレスtemp + countに格納された整数値に評価されることを意味します。

あなたは間接参照を示すとして最初の意味を考えることによって、混乱の一部を排除することができますが:int* int_ptrint *int_ptrと等価である、すなわち、「あなたint_ptr逆参照すれば、あなたはintを得るでしょう。」ポインタ型としてない - これはint* int_one, int_twointとしてint、そしてint_twoからポインタとしてint_oneを宣言する理由の直感的な感覚を与えます。

関連する問題