ただ、それは価値があるかもしれないもののために、2つ目のバージョン:
printf("%s" , &s);
は未定義の動作をし、唯一の事故によって動作しますしています。明示的にアドレスを取得すると、配列のアドレスが取得されています(これは問題ありません)が、printf
'の場合に必要な "charへのポインタ"型ではなく、 "配列の12文字へのポインタ" s%sの変換です。型が一致しないため、結果は未定義の動作です。
実際には、というだけで、という専門性があります。このコードは、私が気付いているCの実装ごとに問題なく動作します。
あなたは違いが存在することを証明したい場合、あなたはかなりかかわらず簡単にそれを行うことができます。例えば:最初のケースで
char string[] = "hello world";
printf("without &: %p, %p\n", (void *)string, (void *)(string+1));
printf("with &: %p, %p\n", (void *)&string, (void *)(&string+1));
、string
は、第2のポインタは、最初より正確に一つ大きくなる最初の行のように、char型へのポインタに減衰します。 2行目では、文字の配列へのポインタに1を追加しています。追加すると、実際に配列のサイズが追加されます。私のマシン上でこれを実行すると、私はこのような結果を得る:
without &: 0038F96C, 0038F96D
with &: 0038F96C, 0038F978
あなたの前の答えを受け入れるようにしなさい – Aravindhan
それをする方法......私はSOの新しいですか? – Pritpal
@Pritpal:それぞれの質問で受け入れる答えの横にあるチェックマークをクリックします。 – Puppy