回答編集履歴

1

追補

2015/09/02 14:10

投稿

退会済みユーザー
test CHANGED
@@ -75,3 +75,131 @@
75
75
  ```
76
76
 
77
77
  配列に入っているデータを順次関数に渡す場合などでは、こういった表現方法も使えます。
78
+
79
+ ---
80
+
81
+
82
+
83
+ [追加]
84
+
85
+ 関数定義の int* も 変数定義の int* もそうですが、これらは「int型のポインタ」を収める変数定義です。
86
+
87
+
88
+
89
+ ポインタというのは「"値を収めたメモリ領域(=変数に割り当てられたメモリ領域)" の番地」を表すものです。
90
+
91
+ そのポインタ変数を * で修飾すると、ポインタの示すメモリに格納された値を表します。
92
+
93
+
94
+
95
+ この逆のパターンが、アドレス修飾子 & です。
96
+
97
+ 例えば int型の変数:num のポインタが欲しい場合は &num と書きます。得られるのは変数に割り当てられたメモリアドレスです。
98
+
99
+
100
+
101
+ これらをコードで示すと、以下のような感じです。
102
+
103
+ ※ポインタ経由で、 num1 = num2; と同じ結果を得る処理を行います。
104
+
105
+
106
+
107
+ ```C
108
+
109
+ int num1, num2;
110
+
111
+ int* pNum;
112
+
113
+
114
+
115
+ num1 = 999; // num1 に 999 を代入
116
+
117
+ pNum = # // num1のポインタを pNum に代入
118
+
119
+ num2 = *pNum; // pNum(num1のメモリアドレス) に格納された値 (= num1の値)を num2に代入
120
+
121
+
122
+
123
+ printf("%d %d %d", num1, *pNum, num2);
124
+
125
+ ```
126
+
127
+
128
+
129
+
130
+
131
+ 関数へのポインタ渡しについては、例えば以下のような感じです。
132
+
133
+
134
+
135
+ test1関数は引数がポインタ渡しなので、test1関数を呼び出す際は 変数:numのポインタを取得して渡しています。
136
+
137
+ test2関数も引数がポインタ渡しです。test2関数を呼び出す際もポインタを渡すことになります。test1関数では既にポインタで値を受け取っていて変数:pNumの中身はnumのポインタです。test2関数を呼び出す時は、変数:pNumに収められたnumのポインタをそのまま渡します。
138
+
139
+
140
+
141
+ もし、test1関数の中で *pNum のように、* で修飾するとポインタの中身ということで、intの値(変数:numに代入した値)を表すことになります。しかし、test2関数はポインタを必要とするので修飾の必要はありません。
142
+
143
+ ※これは & で修飾した場合の逆パターンです。
144
+
145
+
146
+
147
+ 実行結果としては、test2関数内の printf関数によって変数:numに代入した値が出力されます。
148
+
149
+
150
+
151
+ ```C
152
+
153
+ void test2(int* pNum){
154
+
155
+ printf("%d", *pNum);
156
+
157
+ };
158
+
159
+
160
+
161
+ void test1(int* pNum){
162
+
163
+ test2(pNum);
164
+
165
+ };
166
+
167
+
168
+
169
+ int num;
170
+
171
+
172
+
173
+ num = 123;
174
+
175
+ test1(&num);
176
+
177
+ ```
178
+
179
+
180
+
181
+ 質問の関数でも同様のポインタ渡しが行われます。
182
+
183
+ https://teratail.com/questions/15327 でも書いたのですが、デバッガで動きを追いかけることをした方がいいですよ。
184
+
185
+
186
+
187
+ 質問の実装も、sort2関数に以下のように渡すことも合わせて考えれば、多少理解の助けになるでしょうか。
188
+
189
+ ```C
190
+
191
+ int *pNA, *pNB;
192
+
193
+
194
+
195
+ pNA = &na;
196
+
197
+ pNB = &nb;
198
+
199
+
200
+
201
+ sort2(pNA,pNB);
202
+
203
+ ```
204
+
205
+