私はこの質問を見つけた本を読んでいました
配列名に言及すると、すべてのコンテキストでベースアドレスが得られますか?
配列名がベースアドレスを与えない場合を誰かが説明できますか.thanks
配列からポインターへの減衰はどこでも発生するわけではありません。1 つの例は の引数でsizeof
、別の例は の引数です&
。
int arr[10];
sizeof(arr); // gives 10 * sizeof(int), NOT sizeof(int*)
int (*p)[10] = &arr; // gives the address of the array, NOT of an rvalue
2 番目の例は、配列からポインターへの減衰の値が左辺値ではないため、かなり明白であり、他の方法では意味がありません。
6.2.3.1 左辺値、配列、および関数指定子
sizeof
3演算子、_Alignof
演算子、または単項演算子 のオペランドであるか、配列の初期化に使用される文字列リテラルである場合を除き、 ''型&
の配列'' 型を持つ式は、''型の式に変換されます。配列オブジェクトの最初の要素を指し、左辺値ではない「型へのポインター」。配列オブジェクトにレジスタ ストレージ クラスがある場合、動作は未定義です。
したがって、次のような宣言が与えられた場合
int a[N];
次の式は、式をポインター型に変換しません。a
sizeof a
_Alignof a
&a
次の宣言が与えられた場合
char str[] = "This is a test";
char *p = "This is another test";
文字列リテラル"This is a test"
は の配列を初期化するために使用されているchar
ため、ポインター式には変換されません。代わりに、配列の内容が にコピーされstr
ます。対照的に、文字列リテラル"This is another test"
は配列の初期化に使用されていないため、ポインター式に変換され、ポインターの値が に書き込まれp
ます。
Array name give address of first element:
int a = {1,2,3};
Suppose address of a is 12
printf(" %u %u",a,&a);
result is
12 12
Where a is address of first element and &a is address of array. same value but different semantic
printf(" %u %u", a+1, &a+1);
result is
14 18
a increased by 2 because 'a' is address of integer and a+1 increase by 2 that is sizeof(int)
where as &a+1 increate by size of array that is 3 int = 3 * sizeof(int)
Assuming sizeof int is 2
そのようなコンテキストの 1 つは、配列の (バイト) サイズを与えるsizeof
演算子です。sizeof(array)