これはいくつかの画像を描画するのに最適な場所です。あなたは
int* a = (int*) malloc(2 * sizeof(int));
を書くときあなたはこのようになり、セットアップを取得:a[0]
とa[1]
に値を割り当てた後
+---------+ +---------+---------+
| addr X | ---> | ????? | ????? |
+---------+ +---------+---------+
pointer a
in main
を、物事は次のようになります。
+---------+ +---------+---------+
| addr X | ---> | 1 | 2 |
+---------+ +---------+---------+
pointer a
in main
それでは、と仮定してみましょうinc(a)
と呼んでいます。これにより、ポインタa
のコピーがinc
関数に渡されます。そこa
という名前の2つのポインタが今しているが、彼らは同じポインタじゃないことを
+---------+ +---------+---------+
| addr X | ---> | 1 | 2 |
+---------+ +---------+---------+
pointer a ^
in main |
|
+---------+ |
| addr X |-----------+
+---------+
pointer a
in inc
は予告:ポインタがコピーされる唯一のものですので、物事は今、このように見えます。ゾーイという名前の友人が2人いれば同じ名前ですが、同じ人ではありません。 inc
インサイド
、あなたは意味
a++;
を書いた「それは現在を指しています1後に次のint
を指すようにポインタa
を進めます。」これは、次のようになります。
+---------+ +---------+---------+
| addr X | ---> | 1 | 2 |
+---------+ +---------+---------+
pointer a ^
in main |
|
+---------+ |
| addr Y |---------------------+
+---------+
pointer a
in inc
そして、我々はa
のコピーを操作しているので、main
でa
バックは、変更されていないことに気づきます。もう一度、ゾーイのアナロジーを考えてみましょう。ゾーイという名前の人と話すと、ゾーイという人と話したことになるわけではありません。ときinc
戻っ結果、a
のコピーは、エーテルの中に消え、そして私たちはこれを左にしている:
+---------+ +---------+---------+
| addr X | ---> | 1 | 2 |
+---------+ +---------+---------+
pointer a
in main
ポインタは変更されませんので、あなたが前とinc
を呼び出した後に同じ値を参照してください理由であります。
しかし、change
を呼び出す方法は異なります。あなたが最初にchange
を呼び出すと、物事は次のようになります。
+---------+ +---------+---------+
| addr X | ---> | 1 | 2 |
+---------+ +---------+---------+
pointer a ^
in main |
|
+---------+ |
| addr X |-----------+
+---------+
pointer a
in change
ときあなたは今、あなたが終わる場所を確認し、値を入れ、a
という名前のポインタをたどる」と言ってい
a[0] = 2;
を書きますそこ2
我々は以下を参照してくださいことを意味します。a[1] = 3
を書く
+---------+ +---------+---------+
| addr X | ---> | 2 | 2 |
+---------+ +---------+---------+
pointer a ^
in main |
|
+---------+ |
| addr X |-----------+
+---------+
pointer a
in change
も「という名前のポインタをたどる意味a
の場合は、インデックス1
の要素に移動し、3
に置き換えます。
+---------+ +---------+---------+
| addr X | ---> | 2 | 3 |
+---------+ +---------+---------+
pointer a ^
in main |
|
+---------+ |
| addr X |-----------+
+---------+
pointer a
in change
さて、change
戻った後、我々は戻ってmain
でいる:これは次のようなります。 main
でa
ポインタが変更されていません - それはまだ前と同じ場所で見ている - それが指し示すだという配列は、その値が変化してきました。
'c 'のすべてが値渡しです。どちらの関数でも、 'a'のローカルコピーが作成されます。 'inc'では、そのローカルコピーをインクリメントするだけで、変更を失ったときに失われます。 'change'では、' a'ポインタのローカルコピーを括弧で間接参照するので、その逆参照に加えられた変更はその関数の外で持続します。 – yano
* "change()は実際にポインタの値を変更します" * - これは** pointed to **オブジェクトを変更します。 – StoryTeller