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

ぷうさん

勝手にドーソ・・・・


困った顔の博士

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


ぷうさん

いいから、早く始めたら?

実行文

#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の計算結果を入れてるから、他の関数内でもその値が読めるわけだ。
博士「Good!」

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


ぷうさん「?」

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


博士

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


ぷうさん「OK」

はいな。
つまり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が指しているメモリの内容ということ?


博士

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


ぷうさん「OK」

・・・・つまりい・・・・

tasizanだけみてみると・・・

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

ぷうさん「OK」

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


博士「Good!」

まあ、いいじゃろ。


博士

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


困った顔の博士

・・・・・

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

じゃから1と2はセットになっとると覚えておくんじゃな。


ぷうさん「OK」

りょーかい!

その三 ポインタ使用例集

二日目 ポインタについて 目次

一日目へ

ぷうさんの七日間戦争 二日目

三日目へ