大きな配列に変数を割り当ててみるぞい。

勝手にドーソ・・・・

・・・ふう・・・よいか、これが分からないようではポインタの理解は不可能なんじゃぞ!
・・・ったく・・・・・・・心配じゃわい・・・。

いいから、早く始めたら?
実行文
#include <stdio.h> int m[100]; //外部変数として宣言 main() { int tasizan,hikizan; tasizan=0,hikizan=1; keisan(30,50,tasizan,hikizan); printf("tasizan=%d hikizan=%d\n",m[tasizan],m[hikizan]); } void keisan(int kazu1,int kazu2,int tasizan,int hikizan) { m[tasizan]=kazu1+kazu2; m[tasizan]=kazu12kazu2; }
チェックポイント

まずじゃ、m[]という配列が外部変数として宣言してあることに注目じゃ。

ほいほい。

これもreturnはないのじゃ。そこで、どこで返しているかというとじゃ、
公共物、配列m[]で返してるんでしょ?というより・・・、
関数「keisan」内で、m[]にtasizalやhikizanの計算結果を入れてるから、他の関数内でもその値が読めるわけだ。

はよ?今日はバカに調子がよいのお!!
いつもこうならいいんじゃが。

でも配列が100まで宣言してあるけど、これって宣言しすぎじゃない?

まあ、そんな事はいいとして。
とにかく順番に入れていってくれるとだけ覚えておいとくれ・・・

はいな。
つまりm[tasizan]としたことで、tasizanの結果を入れるロッカーの番号、
つまり配列がm[]のうちのどれかに指定されたって事でいいんでしょ?順番にいくならm[0]かな?
でhikizanの答えがm[1]にストックされる、と。
つまり、配列m[]にネーミングしちゃったと覚えれば簡単だ!

・・・・そうかね・・・・ホントに分かったのかね?

何?その疑いの眼は?いいから、次いってみよう☆
ポインタとは
ではお次のプログラムじゃ。前のと比べてみてくれ。
実行文
#include <stdio.h> void keisan(int kazu1,int kazu2,int *tasizan,int *hikizan); int m[100]; main() { int *tasizan; //注1 int *hikizan; tasizan=&m[0]; //注2 hikizan=&m[1]; keisan(30,50,tasizan,hikizan); printf("tasizan=%d hikizan=%d\n",*(tasizan),*(hikizan)); } void keisan(int kazu1,int kazu2,int *tasizan,int *hikizan) { *(tasizan)=kazu1+kazu2; *(tasizan)=kazu12kazu2; }
注1・・・ポインタtasizanの指しているメモリの領域が整数型だよ
注2・・・&m[0]はm[0]のアドレスを意味する
チェックポイントもとい雑談?

どうじゃ?比べてみて・・・今日のお前さんのおつむなら分かると思うんじゃが。

う~・・・・わん、わんっ!

・・・・・な、なんじゃ、いきなり?!

RED ALARM!! 警告します!アクセスが拒否されました!
非常驚報!何を口走るか分かりません!!

な~にを言っとるかあっ!

体罰反た~い!

お前さんの石頭はびくともせんわっ!

・・・・・どうせ、脳みそも固いもん!!

柔らかくするには常に手を入れてな、腐ってしまわんように・・・って!のせるな

のったのは博士の勝手だ!

ゴホン・・つまり手を入れる、勉強するという事じゃ。
頭を働かせてこそ人間というもんじゃ。

脳みそこねこねコンパイル・・・・余計悪くなりそう・・・。

糠味噌だって手を入れて腐らんようにするんじゃぞ。
そうするといつまでもたくあんが美味く・・・・・

・・・美味く食べられるんじゃぞ・・・・・
今度こそチェックポイント

うー、ごほん!今回のプログラムは、じゃな。
配列mに変数を割り当てる代わりに、直接メモリに割り当てたというわけじゃ。
つまり、tasizan、hikizanという変数にメモリのアドレスをもたせたわけじゃ。

それって結局一緒じゃない?

・・・そこでじゃ、C言語では変数のアドレスを記憶させる特別な変数を用意したんじゃ。
それを「ポインタ」と呼ぶんじゃ。
ポインタには『*』をつけて、「int tasizan」というように宣言するのじゃ。
それから、ポインタが指しているメモリの内容を*()を使って表すのじゃ。

・・ということは、*(tasizan)はtasizanが指しているメモリの内容ということ?

そうじゃ。分かったかの?

・・・・つまりい・・・・
tasizanだけみてみると・・・
- int *tasizanでtasizanという名前のポインタを使うゾと宣言
- tasizan&m[0]でm[0]のメモリのアドレスにtasizanという名前をつけておく
- keisan(30,50,tasizan,hikizan)で値をその型式と同じ関数に渡す
- keisan関数でもらった値で足し算の処理
- その答えをポインタtasizanが指しているメモリの中に入れる
- main関数に戻ってポインタtasizanが指す値を表示

とまあ、こんくらいの理解でいいかな?
もちろん引き算も同様ネ。

まあ、いいじゃろ。

うまくポインタたくあんが漬かったようで・・・・

・・・・・
- tasizanというアドレスを入れる箱ができただけじゃな。
これだけじゃと、どのメモリかはまだ決まっておらん。 - ポインタtasizanにm[0[のアドレスを代入しておるんじゃ。
これで、初めてポインタtasizanが指すアドレスが決まったわけじゃぞ。
じゃから1と2はセットになっとると覚えておくんじゃな。

りょーかい!