典型的な環境を考えてみましょう。次のコードが C で違法なのはなぜですか?
{
int x;
&x = (int*) malloc(3*sizeof(int));
...
}
のアドレスは左辺値ではないx
ため、のアドレスに何かを割り当てることはできませんx
(Anlvalue
は「代入できるもの」です。つまり、等号の左側に置くことはできません)
試す
int* x;
x = (int*) malloc(3*sizeof(int)); // TODO: Call free(x)
x
割り当てられたメモリを指すようになり、次のようなことができます
int foo = *x;
int bar = x[0];
次のように演算子を使用して、のアドレスを別のものに割り当てることができます。x
&
int x = 1;
int* y = &x; // y now holds the address of x
*y = 2; // Now x = 2
x のアドレスは左辺値ではないため、変更できるものではありません。C では、アドレスが指すものを変更できますが、アドレス自体を変更することはできません。
誰もが正しいです。コード実行時の X のアドレスは定数です。言い換えれば、「コンパイラである私が 'x' 変数を格納する場所を変更できます」ということです。
あなたはこれを行うことができます
int main()
{
int* x;
*(&x) = malloc(3*sizeof(int));
}
変数のアドレスは変更できません。代わりに、おそらく次のようなものが必要です。
int *x = (int *)malloc(3 * sizeof(int));
...
free(x);
&x は、x へのポインターを返します。割り当ての左側では使用できず、右側でのみ使用できます。
ポインターに何かを割り当てたい場合は、 int *x;のようにポインターとして宣言する必要があります。
それが言語の設計方法です。必要なことを行うには、ポインターを使用します。