*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=&ixのメモリ位置を指しているメモリ位置を変更します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 = iiこれにより、の値が。が指すメモリ位置
に実際に割り当てられxます。
x = &iiこれにより、変数のアドレスがポインタ変数に
割り当てられますx。xポインタである必要があります。
これを行うと、プロセスのアドレス空間に属していないx = iアドレス(この場合は)を誤って割り当てようとしているため、ランタイムエラーが発生します。2これを正常に行うには、iもポインタである必要があり、アドレス空間にあるアドレスを指している必要があります。
すると*x = *i、あなたの場合は再びエラーが発生します。iがポインタの場合、が指すアドレスは、が指すアドレスxに存在する値を取得しますi。
*x = ixが指すメモリアドレスに2を割り当てます。xがmallocまたはスタック変数のバッファまたはアドレスへの割り当てを介してメモリアドレスに初期化されていないため、これはおそらくクラッシュすることに注意してください。
x = &iポインタxを変数のアドレスに割り当てますi。
x = iポインタxをの値に割り当てます2。これは、無効なメモリアドレスを指している可能性が高く、キャストが必要です。
*x = *iの現在の値に依存しますx。また、iはポインタではないため、逆参照することはできません。
*x = &ixが指すメモリアドレスにのアドレスを書き込みます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のアドレスを指すようにするということです。そして、私はあなたが自分で他のものを理解することができるはずだと思います!