-2

もしも

int number[];
int *tommy;

では、次のステートメントの違いは何ですか?どちらのステートメントも、番号のアドレスをtommyにコピーしませんか?

tommy = &number;

また

tommy = number;

編集:申し訳ありませんが、私は単にintではなくint配列を意味していました。

4

6 に答える 6

2

number最初のものはのアドレスをに割り当てますtommynumber2つ目は、ポインタに番号を割り当てようとしますtommyが、コンパイルに失敗するはずです。

編集

編集では、それは逆です。最初のものはコンパイルされるべきではありません。int配列のアドレスは型int (*)[size]であり、に変換することはできませんint*

于 2013-03-22T13:15:24.600 に答える
2

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は有効です。

于 2013-03-22T13:25:35.523 に答える
1

コンパイルする例では、配列に次のサイズが必要です。

int number[1];

サイズが不明な変数を作成できないためです。

tommy = &number;

error: cannot convert ‘int (*)[1]’ to ‘int*’ in assignment

これはコンパイルされるべきではありません。&numberは配列へのポインタであり、へのポインタに変換intできないため、そのタイプの変数に割り当てることはできません。

tommy = number;

これで結構です。式で使用すると、配列を最初の要素へのポインターに変換できます。そのポインタタイプはint*、と同じtommyであるため、割り当てが許可されます。

于 2013-03-22T13:29:59.827 に答える
0

最初の割り当ては正しいです-それnumberはポインタにのアドレスを割り当てますtommy

2番目の割り当ては、のnumberポインタに割り当てますtommy

于 2013-03-22T13:15:32.460 に答える
0

&いいえ、そうではありません。reference operatorまたはaddress of、事前に追加した変数のアドレスを取得するので、これで必要な処理が実行されます。

tommy = &number

プレーンを使用するnumberと、numberに格納されている整数値が返されるだけで、コンパイルされません。ポインタに関するこのリファレンスでは、さらに詳しく説明します。

Update:

したがって、質問を編集した後、これはサイズなしではコンパイルされません。

int number[];

これは有効です:

int number[10];

逆になりました。これは有効で、コンパイルされます。

tommy = number ;

2行目は、整数の配列を単一の整数として処理しようとしますが、コンパイラーはこれを許可しないため、無効です。

tommey = &number ;
于 2013-03-22T13:15:39.397 に答える
0

いいえ、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ますtommytommy42は(おそらく)有効なアドレスではないため、逆参照(が指すデータにアクセス)しようとすると、セグメンテーション違反が発生する可能性があります。

*少なくとも、オペレーティングシステムは、アドレス空間が線形で連続しているような錯覚を与えます。

于 2013-03-22T13:22:34.113 に答える