ポインター操作に疑問があります...
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つの出力はどのように来ていますか..誰か私に説明できますか..?
コードが変更されました.....
これは未定義の動作です。
ポインターは、その場所に値を追加する前に、有効なものを指している必要があります。
char a = 10;
char *p = &a;
2 つのシナリオについて説明します。
char * p = x;
x == 10
は、p
10 (ユーザー プログラムがアクセスできないアドレス) で初期化される 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が得られます
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
p
10で&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");
}
コード内のいくつかのエラー:
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
char *p=10;
現在のコードには未定義の動作があります。ポインタp
は、その場所で 10 を初期化するための有効なメモリ位置を指していません。
そうは言っても、 bothは同じメモリ位置p
を生成します。&p[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