*x=i
との違いは何x=&i
ですか?
コード:
int i=2;
int *x;
*x=i; //what is the difference between this...
x=&i; //...and this??
//Also, what happens when I do these? Not really important but curious.
x=i;
*x=*i;
*x=i; //what is the difference between this...
i
これにより、が指すアドレスに格納されている整数にの値が割り当てられます。x
x=&i; //...and this??
これにより、のアドレスがに割り当てi
られx
ます。
この例x
では割り当てられていないため、の動作*x=i
は定義されていないことに注意してください。
これがより良いイラストです:
int i = 2, j = 5;
printf("%d %d\n", i, j); // Prints 2 5
int *x = &j;
*x = i;
printf("%d %d\n", i, j); // Prints 2 2
*x=i
が指すメモリ位置に格納されてx
いる値を、に格納されている値と等しくなるように変更しますi
。
x=&i
x
のメモリ位置を指しているメモリ位置を変更しますi
。
x=i
間違っている。ほとんどの場合、セグメンテーション違反が発生します。
*x=*i
間違っている。はポインタではないi
ため、を逆参照することはできません。i
*x=&i
(実際には、より適切には*x=(int)&i
)は、のメモリ位置を、がi
指すメモリ位置に整数として格納しx
ます。
int i=2;
int *x;
*x=i; // x is not initialized, this is undefined behavior
x=&i; // this assigns the address of i to x
と
*x=&i; // is invalid C. You cannot assign a pointer to an
// integer without an explicit conversion.
*x = i
i
これにより、の値が。が指すメモリ位置
に実際に割り当てられx
ます。
x = &i
i
これにより、変数のアドレスがポインタ変数に
割り当てられますx
。x
ポインタである必要があります。
これを行うと、プロセスのアドレス空間に属していないx = i
アドレス(この場合は)を誤って割り当てようとしているため、ランタイムエラーが発生します。2
これを正常に行うには、i
もポインタである必要があり、アドレス空間にあるアドレスを指している必要があります。
すると*x = *i
、あなたの場合は再びエラーが発生します。i
がポインタの場合、が指すアドレスは、が指すアドレスx
に存在する値を取得しますi
。
*x = i
xが指すメモリアドレスに2を割り当てます。xがmallocまたはスタック変数のバッファまたはアドレスへの割り当てを介してメモリアドレスに初期化されていないため、これはおそらくクラッシュすることに注意してください。
x = &i
ポインタx
を変数のアドレスに割り当てますi
。
x = i
ポインタx
をの値に割り当てます2
。これは、無効なメモリアドレスを指している可能性が高く、キャストが必要です。
*x = *i
の現在の値に依存しますx
。また、i
はポインタではないため、逆参照することはできません。
*x = &i
xが指すメモリアドレスにのアドレスを書き込みますi
。これは、その前のコードによって異なります。xを有効なアドレスに割り当てないと、クラッシュする可能性があります。
これらの呼び出しの一部では、構文的に正しいキャストが必要になります。
*x=i;
ポインタx
を逆参照し、を割り当てi
ます。
x=&i
ポインタx
を変数に向けますi
。
*x = i
に格納されているアドレスに格納されている値を変更しますx
。あなたの場合、編集されていない場合、アドレスx
がジャンクである可能性が高いため、クラッシュしますNULL
。malloc()
またはnew
または何かが必要になります。
x = &i
に格納されているアドレスを変更します。x
つまり、は変数のアドレスですi
。これはあなたの例では完全に安全です。
さて、あなたが言うとき
*x = i
あなたが言っているのは、変数xが値iを指すようにすることです。あなたが言う時
x = &i
アドレスxがiのアドレスを指すようにするということです。そして、私はあなたが自分で他のものを理解することができるはずだと思います!