0

&オペレーターの仕組みとその重要性が理解できません。

この例をオンラインで見つけました:

 #include <stdio.h>

void main()
{
  int a = 10;
  printf("\nValue of n is : %d" ,n);
  printf("\nValue of &n is : %u", &n);
}

出力:

Value of  n is : 10
Value of &n is : 1002

まず、なぜ&nこれら 2 つの余分な数字が出力されるのでしょうか。

第二に、なぜこれが重要なのですか?

4

4 に答える 4

0

演算子 の&アドレスは、次の変数のメモリ アドレスを返します。これは次の理由で重要です。

  1. 軽量ハンドルで大きなメモリ チャンク (構造体、配列、動的に割り当てられた非構造化メモリ領域) を参照できます。

  2. データ構造の内部表現にアクセスする手段を提供します

  3. 同じインターフェースを介してさまざまなタイプのデータを処理できます

于 2013-04-17T23:14:12.817 に答える
0

演算子は、&演算子の「アドレス」です。soはa の値だけでなく、 を&a意味します。address of a

これが伝えていることは、値が であっても、 a のアドレスが1002(または、dreamlax が指摘したように、printf の使用方法に奇妙な点があるため、実際のアドレスではない可能性が高い) ということです10。2 つの値の間に厳密な相関関係はないことに注意してa=121765ください&a=494260

変数のアドレスを知ることで、変数が「参照」または「指している」特定の値/オブジェクトを操作できます。コピーを操作するのではなく、その特定の値/オブジェクトを操作する関数が必要な場合は、変数のアドレスを渡す必要があります。

次のコードを取ります (完全なコードである必要はありません)。

int main(void)
{
    int a = 10;
    doIt(a);
    printf("after doIt: %d", a);
    doItByReference(&a);
    printf("after doItByReference: %d", a);
}

void doIt(int val)
{
    val = 13;
}

void doItByReference(int *val)
{
    *val = 15;
}

を呼び出すと、doItが保持する値が渡さaれ、別のアドレスにある新しい整数変数にその値がコピーされます。a関数はこの複製コピーを自由に変更でき、元の変数に変更は見られません。

ただし、呼び出しdoItByReferenceは のアドレスを渡しますa。指定されたアドレスの値に加えられた変更は、 に加えられた変更として反映されますa

これは、特定のオブジェクトに変更を加えて、それらの変更を元のコピーに反映させたい場合に便利です。ただし、元のコピーの値を変更したくない場合でも、値をコピーする必要がないため、これはパフォーマンス面で役立ちます。4 バイト (正確な値は重要ではありません) などの単純な int の場合、これは重要ではありません。

ただし、数千または数百万バイトの構造体があるとします。

struct LargeStruct
{
    int buffer[134217728];
};

void doIt(LargeStruct buffer)
{
    // ... do something
}

void doItByReference(LargeStruct *buffer)
{
    // ... do something
}

今回は、 を呼び出すたびに、数百万バイトのオブジェクトdoIt全体をコピーする必要がLargeStructありますが、 doItByReference を呼び出すと既存のオブジェクトが使用されるだけで、コピーは必要ありません。

于 2013-04-17T22:35:10.277 に答える
0

n は変数です。値を表します。
&n は n への参照です。nがストアであるメモリ内のアドレスを表します。

なぜそれが重要なのかについて:

C で配列を渡す場合、通常、関数はポインターを想定しています。(つまり、単に int ではなく int*)。
関数に 'n' を渡すと、型が一致しない (n=int、関数は int* を予期する) ため、コンパイル時に問題が発生します。
&n を渡すと、関数が期待する 'n' にアドレスを渡すことになります。

于 2013-04-17T22:36:30.090 に答える
0

C でアドレスを出力するには、通常%p、代わりに inを使用する必要があり%uます。

Note%pはアドレスを 16 進数で出力します。

于 2013-04-17T22:51:39.697 に答える