マルチスレッド版数独自動生成ソフトC++コードを題材とする超初心者のためのVisual Studio C++講義
第7章 関数の学習

第12話 驚愕の結末


1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64

1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64

1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64

1 2 3 4 4 6 7 8
9 10 11 12 13 14 15 9
17 18 19 20 21 22 18 24
25 26 27 28 29 27 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64


なんと明るい紫どころか、

1つも交換されていません。

したがって、自然配列が4回も繰り返されています。

なぜでしょう?

void 交換係社員(int x, int y) {

  int u;//交換のための受け皿

  u = x;//xのデータがyのデータに上書きされる前にuにxのデータを保存

  x = y;//yのデータでxのデータを上書きする

  y = u;//xの元データでyのデータを上書き

}

で確かに交換されたように見えます。

実は、プログラミング歴35年の私からすれば、

楽勝だと思って組んだのが第11話コードだったのです。

結果にはわが目を疑いました。

ですが、ちょっと考えて当たり前だと気が付きました。

配列は鍵のない金庫だと表現してきました。

実は、変数も中に部屋が1つしかないですが、

鍵のない金庫なのです。

そして、2次元配列を送るときに金庫自体を物理的に送ることはできないと申し上げました。

ですから、変数自体も基本的には送ることはできません。

配列の場合棚がいっぱいあるから、

物理的に送れないのはわかるけど、

箱と表現してきた変数そのものを送ることができない、

と言われても納得できないと思うでしょう。

C言語およびC++で送ることができるのは値のみです。

でも、2次元配列にしても1次元配列にしてもちゃんと送れたではないですか、

という抗議の声が聞こえてきそうです。

ですが、2次元配列で送ったものは配列の先頭アドレスだと申し上げました。

先頭アドレスとはアドレスの最初です。

変数や配列には型によって、

アドレスの幅が決まっています。

だから、先頭アドレスを送れば入れるのすべての値を参照することができます。

他のサイトの講義では、メモリ・アドレス・参照という専門用語が乱発されます。

最初こそ説明されますが、

2回目以降は、本サイト以外では説明されません。

参照だけは漢字になっていますが、

これまた、初心者には意味の分からない言葉です。

本サイトでも一度だけ説明していますが、

ほとんどの方は覚えてないよ!と思うのではないでしょうか。

参照とは変数という箱あるいは変数という金庫の中身を見ることを言います。

中を参照しているだと言われれば、

参照の意味が分かるのではないでしょうか。

変数のところで、


同じ a であっても意味が異なることを説明しました。

赤い囲いの1つ目の a は変数そのもの つまり箱そのものであるが、

2つ目の a はその箱に入っている値であると説明しました。

そのときに、箱の中を見ることを参照というのだと書いてあったこと思い出しましたか。

    交換係社員(x, y);

も箱そのものを送ったのではありません。

箱を参照した値を送っているのであって、

金庫である箱を送っているわけではないのです。

すると、

void 交換係社員(int x, int y) {

  int u;//交換のための受け皿

  u = x;//xのデータがyのデータに上書きされる前にuにxのデータを保存

  x = y;//yのデータでxのデータを上書きする

  y = u;//xの元データでyのデータを上書き

}

まったく意味のないことをやっています。

値しか送れないのです。

では、なぜ配列では成功したのでしょうか。

    交換係社員(x);

実は、送っているのはやはり値です。

ただし、値と言っても先頭アドレス(金庫のある場所)です。

次章のポインタで説明しますが、

そのアドレスを代入することのできる変数をポインタというのです。

アドレスを扱える言語は私の知っている範囲で言うと、

C言語とC++のみです。

ポインタは箱の中身はアドレス(金庫の在り処)です。

そして、ややこしいのですがアドレスを入れる箱自身にもアドレス(住所)があります。

ポインタも鍵のない金庫ですから在り場所を持っているのです。

詳しくはポインタで説明しますが、

C言語とC++の最大の難所はポインタです。

ですから、ポインタを理解すると世界が大変広がります。

基本他の言語にはない機能ですから。

では、前話のコードは全く意味ないのでしょうか。

そうではありません。

配列の場合先頭アドレスが送れたのと同様に、

変数の在り処である変数のアドレスを送る方法があるのです。

第12話でそのコードお見せしますが、

第8章のポインタの先取りをしています。

ですから、詳しい説明は第8章となります。







第7章第11話へ 第7章第13話へ

本講義トップへ