3

配列とポインターの間に存在する特別な関係を理解し​​ようとしています。つまり、角かっこのない配列名は常に配列の最初の要素を指します。

Linux システムでは、C プログラムでこれを取得します。

char name[7] = "unique";

printf("\nAddress stored of name: %p", name); 
printf("\nAddress stored of name: %s", name); //Conflict
printf("\nAddress of name[0]: %p", &name[0]);

//dereferencing the pointer
printf("\nValue of name[0]: %c", *name);
printf("\nValue of name[1]: %c", *(name+1));

出力は次のとおりです。

Address stored of name: 0xbff68131
Address stored of name: unique
Address of name[0]: 0xbff68131
Value of name[0]: u
Value of name[1]: n

//Conflictとしてのコード行の出力を除いて、上記の出力のすべてを理解しています。言い換えれば、配列とポインターの間の特別な関係に従ってnameが&name[0]と同等である場合、フォーマット指定子を (%p から %s に) 変更するだけで配列の実際の値が出力されるのはなぜでしょう。それが本当なら、name&name[0]*nameはすべて同等ということですか?

少なくとも (//Conflict) 他の (ガベージ?) 値を出力することを期待しますが、配列の実際の値は出力しません。

4

2 に答える 2

2
%s

これはprintf、引数を文字の配列を含むメモリ位置へのポインタとして扱うように指示し、\0遭遇するまでそれぞれを出力します。

%p

ご覧のとおり、これは引数をメモリ ロケーションとして扱い、その値を 16 進数で出力します。

「競合」と呼んでいるものは、実際にははるかに重要な用途であり、c-strings を印刷する正しい方法です。

于 2013-03-05T02:52:50.657 に答える
-1

ポインタ式の代わりに配列式を使用すると、配列式は最初の要素へのポインタに変換されます。最初の要素へのポインタはarray+0or&array[0]で、最初の要素は*(array+0)orarray[0]です。

ではprintf("\nAddress stored of name: %p", name);、配列式は最初の要素へのポインタに変換されます。同様にprintf("\nAddress stored of name: %s", name);、 name は へのポインタに変換されますname[0]。1 を追加すると、 へのポインタになりname[1]ます。name[2]2 を追加すると、 などへのポインターになります。

array[n]演算子は実際にはpointer[n]演算子でありarray、最初の式へのポインターに変換されることに注意してください。n がポインターに追加されて、n 番目の要素へのポインターが生成されます。次に、そのポインターから n 番目の要素を生成するために逆参照されます。%sこれは、フォーマット指定子の結果として発生します。ただし、%pフォーマット指定子は逆参照をまったく行いません。

それが本当なら、name、&name[0]、*name はすべて同等ということですか?

No.nameは配列式です。sizeof name結果は 7になります。&name[0]は、「name[0] へのポインタ」に変換されるポインタ式です。sizeof &name[0]結果はsizeof (char *). *nameは、「名前が指す char」に変換される char 式です。sizeof *name1 となります。

于 2013-03-05T03:14:07.373 に答える