もしも
int number[];
int *tommy;
では、次のステートメントの違いは何ですか?どちらのステートメントも、番号のアドレスをtommyにコピーしませんか?
tommy = &number;
また
tommy = number;
編集:申し訳ありませんが、私は単にintではなくint配列を意味していました。
number
最初のものはのアドレスをに割り当てますtommy
。number
2つ目は、ポインタに番号を割り当てようとしますtommy
が、コンパイルに失敗するはずです。
編集
編集では、それは逆です。最初のものはコンパイルされるべきではありません。int配列のアドレスは型int (*)[size]
であり、に変換することはできませんint*
。
int number;
整数を定義しnumber
ます。整数を指すポインタとしてint *tommy;
定義されます。tommy
tommy = &number;
number
のアドレスをに割り当てますtommy
。*tommy
実際の数を示します。
tommy = number
の値を格納しnumber
ますtommy
。1つは、コンパイルエラーがあるはずです。それに加えて、に保存することに成功するとnumber
、アドレスがコンテンツと同じである無効な場所からの逸脱を試み、セグメンテーション違反につながります。tommy
*tommy
number
追記
このような例を見たら、私は考えたくなります
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
に評価されますが、式は値自体に直接評価されます。number
number
numberの値が42であり、アドレス1024でメモリに格納されているとします。メモリは線形*であるため、次のようになります。
+--------+ Address 0
| ...... |
+--------+
| 42 | Address 1024 (value is stored here)
+--------+
| ...... |
+--------+ Address xxxx
ここで、ステートメントは値1024をのアドレスにtommy = &number;
割り当てます。tommy
&number == 1024
number
もう1つのステートメントは、コンパイルされる場合、(無意味な)値42(の値)をに割り当てnumber
ますtommy
。tommy
42は(おそらく)有効なアドレスではないため、逆参照(が指すデータにアクセス)しようとすると、セグメンテーション違反が発生する可能性があります。
*少なくとも、オペレーティングシステムは、アドレス空間が線形で連続しているような錯覚を与えます。