2017-04-08 19 views
1

整数配列と文字配列を指しているときにポインタの動作が異なるのはなぜですか?ポインタと配列[intポインタとcharポインタ]

例えば

int num[] = {1,2,3}; 
cout << num ; 

これは最初の要素のADDRESSを出力

char list[] = { '1', '2', '3'}; 
cout << list ; 

これは、配列の全体の要素のVALUEをプリントアウト!

同様

cout << (num+1) ; 

第二の要素のアドレスをプリントアウトします。

cout << (list+1); 

がプリントアウト私の理解から、第二の要素

から始まる配列全体のVALUEをしながら、配列名は、配列の最初の要素へのポインタです。逆参照演算子(*)がなければ、ポインタは要素のアドレスを返さなければなりません。しかし、なぜcharポインタが値を返すのですか?

+0

異なっているのは、 'operator <<'はオーバーロードされた関数であり、 'char *'には他のポインタ型とは異なるオーバーロードがあります。 –

+0

CはC++ではありませんCです。 – Olaf

+0

私はこの問題がC++専用であることを認識しませんでした。私は、これがPointers&arrayのコンセプト全体と関連していると思いました。申し訳ありません – Aditya

答えて

4

異なる動作をするポインタではありません。動作は、C++標準ライブラリがポインタ出力を処理する方法です。

具体的には、オペレータ<<は、NULL終了C文字列を処理するnon-member overload for const char *を持ちます。これは、配列charの印刷に適用される過負荷です。文字配列はではなく、で終端されていないので、それを印刷すると未定義の動作が発生することに注意してください。あなたは文字の配列にゼロを追加することによってこの問題を解決することができます

char list[] = { '1', '2', '3', '\0'}; 

intポインタを印刷に適用されるan overload that takes void *は、もあります。

+0

''\ 0'の代わりに' 0'だけ使用できます。 –