1

ポインター逆参照の問題に遭遇しました。

C では、&a は a のアドレスを意味します。a がポインターの場合、 &a は単にそのポインターのアドレスを意味します。

したがって、次の場合:

char ptr [] = "abcd"

ptr は、最初の文字 'a' を指すポインターでなければなりません。したがって、

&ptr

'a' のアドレスとは異なる ptr のアドレスである必要があります。ただし、次のコードを試してみると、本当に混乱しました。

int main()
{
    char a [] = "abcd";

    printf("0x%X 0x%X", a, &a);

}

Output: 0xBF7E62AB 0xBF7E62AB

a と &a が同じ値を持つ理由を誰か説明できますか? 私の理解に基づいて、それらは異なるはずです。前もって感謝します

4

6 に答える 6

3

したがって、次の場合char ptr [] = "abcd"、 ptr は最初の文字を指すポインターである必要があります。

いいえ、まったくありません。

ptr配列です。また、配列はポインターではありません。

実際、実際のポインターとして宣言ptrした場合、期待される動作が得られます。

const char *ptr = "abcd";
printf("ptr = %p, &ptr = %p\n", (void *)ptr, (void *)&ptr);

配列のアドレスが最初の要素のアドレスと同じである理由については、非常に論理的です。配列は、要素の連続シーケンスを表します。配列のアドレスは、配列がメモリ内で始まる場所です。最初の要素が始まるところから始まります。したがって、最初の要素のアドレスは、配列自体のアドレスと同じです (むしろ「可能」です。標準ではこの動作は義務付けられていません)。

+-----------+-----------+- - - -
| element 1 | element 2 |
+-----------+-----------+- - - -
^ start of array
^ start of first element
于 2013-10-22T21:15:49.033 に答える
2

a と &a が同じ値を持つ理由を誰か説明できますか? 私の理解に基づいて、それらは異なるはずです。

声明では

  printf("0x%X 0x%X", a, &a);  

aとはどちらも&aタイプが異なります。achar *タイプ(減衰後)&aですが、char (*)[5]タイプです。
a最初の要素へのポインターに減衰するためa、文字列の最初の要素のアドレスです。While&aは文字列"abcd"のアドレスで、最初の要素のアドレスと同じです。

于 2013-10-22T20:44:45.977 に答える
0

配列は常にメモリに格納されている場所を参照します。そのため、a を出力すると、その場所のアドレスが得られます。これは、配列 (&a) を指すポインターを取得するのと同じです。

于 2013-10-22T20:46:06.253 に答える