もしも
int number[];
int *tommy;
では、次のステートメントの違いは何ですか?どちらのステートメントも、番号のアドレスをtommyにコピーしませんか?
tommy = &number;
また
tommy = number;
編集:申し訳ありませんが、私は単にintではなくint配列を意味していました。
number最初のものはのアドレスをに割り当てますtommy。number2つ目は、ポインタに番号を割り当てようとしますtommyが、コンパイルに失敗するはずです。
編集
編集では、それは逆です。最初のものはコンパイルされるべきではありません。int配列のアドレスは型int (*)[size]であり、に変換することはできませんint*。
int number;整数を定義しnumberます。整数を指すポインタとしてint *tommy;定義されます。tommy
tommy = &number;numberのアドレスをに割り当てますtommy。*tommy実際の数を示します。
tommy = numberの値を格納しnumberますtommy。1つは、コンパイルエラーがあるはずです。それに加えて、に保存することに成功するとnumber、アドレスがコンテンツと同じである無効な場所からの逸脱を試み、セグメンテーション違反につながります。tommy*tommynumber
追記
このような例を見たら、私は考えたくなります
int a[10];
int *tommy;
tommy = a; // This will work
この例でaは、は配列の名前であり、配列のアドレスまたは配列の最初の要素、つまり。に相当します&a[0]。aしたがって、への保存tommyは有効です。
コンパイルする例では、配列に次のサイズが必要です。
int number[1];
サイズが不明な変数を作成できないためです。
tommy = &number;
error: cannot convert ‘int (*)[1]’ to ‘int*’ in assignment
これはコンパイルされるべきではありません。&numberは配列へのポインタであり、へのポインタに変換intできないため、そのタイプの変数に割り当てることはできません。
tommy = number;
これで結構です。式で使用すると、配列を最初の要素へのポインターに変換できます。そのポインタタイプはint*、と同じtommyであるため、割り当てが許可されます。
最初の割り当ては正しいです-それnumberはポインタにのアドレスを割り当てますtommy。
2番目の割り当ては、の値をnumberポインタに割り当てますtommy。
&いいえ、そうではありません。reference operatorまたはaddress of、事前に追加した変数のアドレスを取得するので、これで必要な処理が実行されます。
tommy = &number
プレーンを使用するnumberと、numberに格納されている整数値が返されるだけで、コンパイルされません。ポインタに関するこのリファレンスでは、さらに詳しく説明します。
Update:
したがって、質問を編集した後、これはサイズなしではコンパイルされません。
int number[];
これは有効です:
int number[10];
逆になりました。これは有効で、コンパイルされます。
tommy = number ;
2行目は、整数の配列を単一の整数として処理しようとしますが、コンパイラーはこれを許可しないため、無効です。
tommey = &number ;
いいえ、2つは根本的に異なります。式は、の値が格納されているアドレス&numberに評価されますが、式は値自体に直接評価されます。numbernumber
numberの値が42であり、アドレス1024でメモリに格納されているとします。メモリは線形*であるため、次のようになります。
+--------+ Address 0
| ...... |
+--------+
| 42 | Address 1024 (value is stored here)
+--------+
| ...... |
+--------+ Address xxxx
ここで、ステートメントは値1024をのアドレスにtommy = &number;割り当てます。tommy&number == 1024number
もう1つのステートメントは、コンパイルされる場合、(無意味な)値42(の値)をに割り当てnumberますtommy。tommy42は(おそらく)有効なアドレスではないため、逆参照(が指すデータにアクセス)しようとすると、セグメンテーション違反が発生する可能性があります。
*少なくとも、オペレーティングシステムは、アドレス空間が線形で連続しているような錯覚を与えます。