次のようなメソッドを呼び出すことの違いは何だろうと思っていました:
int x;
mymethod(x);
と
mymethod(&x);
次のようなメソッドを呼び出すことの違いは何だろうと思っていました:
int x;
mymethod(x);
と
mymethod(&x);
C は常に値渡しを行うため、関数自体でx を変更できるようにするには、xのアドレスを渡す必要があります。
mymethod(x);
x を渡します。たとえば、x が 2 の場合、次のように書くこともできますmymethod(2)
mymethod(&x)
アドレスを x に渡します。メソッドはそのアドレスに格納されている値を変更できるようになったため、関数の完了後に x の実際の値が変更されている可能性があります。
これで、ポインターを宣言することもできます。
int* y; //y is now a pointer to a memory address
y = &x; //y now points to the memory address of x;
*y = 5; will set the "value found at the address y" to 5, thus will set x to 5;
mymethod(x)
整数x
をパラメーターとして渡します。mymethod(&x)
のメモリ内のアドレスを渡しますx
。引数として int へのポインタが必要な場合は、2 番目のものを使用します。
簡単に言うと、ポインターを宣言するときは、その前にアスタリスクを付けます。
int *ptr;
&x
の代わりに渡すx
と、メモリアドレスが渡されます。
この便利なポインターの紹介を読んでください。
よろしく。
行: int x;
「int」のサイズでメモリを割り当てます。この説明では、int のサイズが 4 バイトであると仮定します (4 バイトではない場合もあります)。
そのため、「int x;」の行の後 「x」に割り当てられたメモリには 4 バイトがあります。「x」の値はこれらの 4 バイト内にあります。たとえば、x=4 の場合、メモリ内では [0, 0, 0, 4] またはバイナリ [0000000, 00000000, 00000000, 00000010] のようになります。 . (実際には [4, 0, 0, 0] になることもありますが、ここでは説明しません)。
したがって、xの値は 4 です。
しかし、メモリに配置されている「x」のアドレスが必要だとしましょう。ここで、演算子「&」の出番です。この演算子を使用して、xのアドレスを要求します。
したがって、[0, 0, 0, 4] がメモリ内の位置 "0x12341234" から始まる場合、&x はその位置 (0x12341234) を返します。ここで、アドレスを変数に格納したい場合、この変数の型は「int」ではなく、「int*」としてマークされている intのアドレスを指すものです。
そう:
int x = 4; // <-- 4 バイトのメモリを割り当て、その値を数値 4 で埋めます。 int* pointer_to_x = &x; // <-- pointer_to_x は、メモリ内で x が配置されているアドレスを指します。
次のように宣言されたメソッドがある場合: void mymethod(int x) よりも、x の値を渡すため、メソッドは mymethod(x) と呼ばれます。
次のように宣言されたメソッドがある場合: void mymethod(int* x) x のアドレスに POINTER を渡すよりも、メソッドは mymethod(&x) と呼ばれます。
これは本当に氷山の一角であり、できる限りシンプルにしようとしました。さらに質問がある場合は、質問してください。
「値による」と「参照による」という用語もありますが、「値による」と「参照による」よりも int と int* の違いをよく理解する必要があります。