2009-05-22 7 views
4

私はCアレイをいじりしたときに、この奇妙な結果につまずい:倒錯変態は

char s[100] = "hello"; 
if(s == &s[0]) printf("true. "); 
if(s == &s) printf("true."); 
// output: true. true. 

私はsは最初の要素のメモリ位置を保持していることを知っているが、検索する方法がありますsのアドレス(最初の要素を指すポインタのアドレス)?なぜ&ssと同じですか?これは便利ではありませんが、何が起こっているのかを知りたいのですが。

異なるコンパイラで異なる実装をしているのかどうかは分かりませんが、gccを使用しています。

答えて

10

文字配列sが位置するメモリ内の場所に指を置くように指示した後、配列内の最初の文字がどこにあるのかを指摘すれば、同じではないでしょうか?

+0

私の指が同じ場所を指しています。ありがとう! –

+0

素敵な類推、私はそれを覚えておく必要があります。 –

9

これは、sがポインタではなく配列であるためです。配列は、必要に応じて(strcpyなどで)自動的にポインタにキャストされますが、「最初の要素を指すポインタのアドレス」はありません。 sはスタック上の100バイトです。ポインタが必要なときはいつでもコンパイラは100バイトのアドレスを関数呼び出しに渡します。

4

アレイsはメモリアドレス(ポインタ)を保持しませんが、実際にはすべての文字を保持します。

Cは、配列を配列へのポインタに自由に変換します。

配列へのポインタは、最初の要素へのポインタと同じです。一方

1

、あなたもこのようなことを行うことができます。その場合は

char (*t)[100] = s; 
if(t == &t[0]) printf("true 3. "); 
if(t == &t) printf("true 4."); 

を、tは確かに自身の記憶とアドレスを持っている文字の配列へのポインタです。ケース3が真でケース4がの偽です。

+2

FYI gccはtの初期化について警告します。 'char(* t)[100] =&s;'が好きです。sと&sの値は同じですが、タイプは少し異なります。 sは型(char *)を持ちます。ここで、&sはtと同じ型を持ち、char(*)[100]です。 – rampion

0
Value of &s, s and &s[0] are same, but their types are not same. 
type of &s is char (*)[100], but type of s and &s[0] is char*. 
&s is a pointer to the entire array but s and &s[0] points to 
the first element of the array. 
sizeof(&s) and sizeof(s) is 100, but sizeof(&s[0]) is 4. 
Similarly if s = 1000, then &s+1 returns 1100 but s+1 and &s[0]+1 returns 1001. 
3

& S [0]配列sの最初の要素のアドレスを意味します。 &のタイプ[0]はchar *です。

&sは、配列sのアドレスを意味します。 &のタイプはchar(*)[100]です。

& s [0] + 1は、次の1バイトのアドレスです。 しかし、& s + 1は、次の1 * 100 = 100バイトのアドレスです。

関連する問題