1

私はこの質問を見つけた本を読んでいました

配列名に言及すると、すべてのコンテキストでベースアドレスが得られますか?

配列名がベースアドレスを与えない場合を誰かが説明できますか.thanks

4

4 に答える 4

5

配列からポインターへの減衰はどこでも発生するわけではありません。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 番目の例は、配列からポインターへの減衰の値が左辺値ではないため、かなり明白であり、他の方法では意味がありません。

于 2012-10-11T11:22:23.910 に答える
3

C 2011 オンライン ドラフト

6.2.3.1 左辺値、配列、および関数指定子

sizeof3演算子、_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ます。

于 2012-10-11T12:51:59.510 に答える
2

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

于 2012-10-11T11:23:41.153 に答える
2

そのようなコンテキストの 1 つは、配列の (バイト) サイズを与えるsizeof演算子です。sizeof(array)

于 2012-10-11T11:22:07.490 に答える