1

ポインター操作に疑問があります...

main()
{   int x=10;  // extra line added...
   char *p=x;

   printf("%d", &p)

   printf("%d", &p[0]);
   printf("%d" , &p[1]);
}

このコードは出力を提供します

10のアドレス.. 10 11

最後の2つの出力はどのように来ていますか..誰か私に説明できますか..?

コードが変更されました.....

4

6 に答える 6

3

これは未定義の動作です。
ポインターは、その場所に値を追加する前に、有効なものを指している必要があります。

char a = 10;
char *p = &a;
于 2012-05-02T05:53:37.813 に答える
2

2 つのシナリオについて説明します。

シナリオ 1:char * p = x;

x == 10は、p10 (ユーザー プログラムがアクセスできないアドレス) で初期化される char ポインターです。p == 10

p(つまり、 )の値は、*pセグメンテーション違反 (無効なメモリ参照) につながります。

p[0] == *(p + 0)&p[0] == (p+0) == p 10 です。

したがってprintf("%p", &p[0])、10が得られます。

p[1] == *(p + 1)&p[1] == (p+1)

pは文字ポインタであるため、 、つまり 1 ずつインクリメントされますsizeof(char)

したがってprintf("%p", &p[1])、10 + 1 = 11が得られます

シナリオ 2: char * p = &x;

pこれは、整数を指す char ポインターです。x

の値x= 10

= 1000のアドレスx(仮定)

したがってp= 1000

p[0] == *(p + 0)&p[0] == (p+0) == p

したがってprintf("%p", &p[0])、1000が得られます

p[1] == *(p + 1)&p[1] == (p+1)

pは文字ポインタであるため、 、つまり 1 ずつインクリメントされますsizeof(char)

すなわち&p[1] == 1000+1 == 1001

于 2012-05-02T09:10:23.550 に答える
1

p10で&p[0]ある同じアドレス (配列の最初の要素のアドレス) に評価されます。

だから&p[0]評価されますと10は11&p[1]&p[0] + sizeof(char)

ただし、 p ( ) を逆参照すると、コードはセグメンテーション違反になる可能性が高くなります*p

次のコードは常に出力されますTrue

main()
{  
    int* p; 
    printf("%s\n",p == &p[0] ? "True" : "False");
}
于 2012-05-02T06:54:18.017 に答える
0

コード内のいくつかのエラー:

int x = 10;
char * p = &x; // error  1 - you was assigning int to pointer

printf("%p\n", &p); //  error 2 - you printing address of pointer (char **), 
                    //  so different format string is needed
printf("%p\n",  &p[0]);  // same error 2 - printing address of first byte in int x
printf("%p\n" , &p[1]);  // same error 2 - printing address of second byte in int x
于 2012-05-02T06:55:53.760 に答える
0
char *p=10; 

現在のコードには未定義の動作があります。ポインタpは、その場所で 10 を初期化するための有効なメモリ位置を指していません。

そうは言っても、 bothは同じメモリ位置pを生成します。&p[0]

于 2012-05-02T05:51:56.770 に答える
0
   printf("%d", &p[0]);
   printf("%d" , &p[1]);

p がポインターされているアドレスを出力します.. char *p=x; x = 10;

次に、 &p[0] = 10、&p[1] = 11 &p[2] = 12 など..

   printf("%d", &p);

これについてはよくわかりませんが、私の場合、メモリ10に含まれる値が出力されることはわかっています= 10000

   printf("%d", p);

*p 値である 10 が出力されます。

cmiiw

于 2012-05-02T09:12:58.657 に答える