2017-05-10 5 views
1

cの配列は配列の最初の要素へのポインタではないと言われます why is array name a pointer to the first element of the array? "printf"を使って配列を出力すると、なぜ配列の代わりに最初の要素のアドレスが表示されるのですか?要素?なぜ配列はCの最初の要素のアドレスを保持していますか?

更新:

const char h[10]="Hello"; 
printf("%p", h); 

出力:00AFFE0C

は同様に1つの答えは言った、これはので、私は

printf("%s", h); 
OR 
printf(h); 
を書くときので、私は指定され、それが意味をなさ%タイプで起こることを言いました

出力:こんにちは

ここで2つの質問が発生する:

1)printf(h);なぜ配列を崩壊させずにポインタ値を出力しないのでしょうか?

2)同じようにint配列を出力するにはどうすればいいですか? int

+0

コードを表示します。 –

+2

いくつかの良い読書:http://stackoverflow.com/questions/1641957/is-an-array-name-a-pointer-in-c – NathanOliver

+0

期待どおりの出力と実際の出力をどのようにして配列を印刷するかの例を示すことができますか? – dbush

答えて

0

配列とポインタの違いは、ポインタだけでは不可能な静的検査のアドレス計算を実行できるように、コンパイラは配列のサイズとサイズを知っていることです。

また、printf()の場合、バリデーション関数なので、渡す内容は関係ありません。あなたが%s引数を渡した場合、それをフォーマット文字列から渡す引数の型について何も知らないので、あなたはそれをchar*にキャストしています。間違った型の引数を渡すと、コンパイラが警告を出す唯一の理由は、それが組み込み関数であり、コンパイラがそれを知っているからです。

配列をとるほとんどの関数は、それらをポインタ引数として取ります。したがって、関数が配列型を引数として指定していない限り、関数を呼び出すときにポインタを暗黙的にキャストしています。

+0

ありがとう、親切に私の更新された質問を確認してください。 –

関連する問題