これら2つは同等ですか?
int a=10;
int *p=a;
AND
int a=10;
int *p;
p=&a;
どちらの場合もpはaのアドレスを保持しますか!?
最初のケースでは、の値は(アドレスを格納する)にa
コピーされるため、アドレス10を指します。p
p
2番目のケースではp
、のアドレスを指しますa
。
3番目のケースがあります:
int a = 10;
int *p = malloc(sizeof(int));
*p = 10;
この場合、の値は(によって予約された)a
が指すアドレスにコピーされます。p
malloc()
最初のケースでは
int a=10;
int *p=a;
変数 a に含まれる値は、変数 p に入れられます。したがって、変数 p の値は 10 です。
2番目のケースでは
int a=10;
int *p;
p=&a;
変数 a の値は 10 で、変数 p の値は a のアドレスです。
最初のケースでは、変数 p が int へのポインターとして宣言されていても、変数 p に入れられる値は、変数 a の値、つまり値 10 です。2 番目のケースでは、変数のアドレスを入れています。 a を変数 p に代入します。
試す:
int main()
{
int a=10;
int *p=a;
}
次にコンパイルします。
> g++ test.cpp
test.cpp: In function ‘int main()’:
test.cpp:4: error: invalid conversion from ‘int’ to ‘int*’
a はポインターではないため、有効な C++ ではありません。型情報がもう少し緩いCはこれを可能にします。しかし、あなたは文字通りあなたが求めるものを手に入れます。の値はp
( a
10) の値です。アドレス 10 へのポインターp
も同様です (それが有効なアドレスであるかどうかは実装定義です)。
2 番目のバージョンは両方の言語で有効です。
のアドレスを取得するためa
、タイプは への割り当てに適していp
ます。その結果、 は をp
指しa
ます。
技術的に正しいのは 2 番目のケースだけです。最初のケースでは、 の値をa
`p˙ に代入するので、整数をポインターに代入します。うまくいくかもしれませんが、そうである必要はありません。
a
2 番目のケースでは、 toのアドレスp
、つまり anint *
をint
変数に正しく割り当てます。これで問題ありません。
変数がポインターとして宣言されている場合でも、コンパイラーは右側の式のアドレスを自動的に取得しないことに注意してください (場合によっては、ポインターリテラルなどでは単に意味をなさないためです... )
ポインターが指すアドレスを持っている必要があり、値がそのアドレスに移動する必要があるため、最初のケースは正しくありません。最初のケースでは、値は指定されていないアドレスに移動するため、エラーになります。
2 番目のケースでは、ポインターは最初に変数のアドレスを指し始めます。したがって、正しい値を含むアドレスを指します。