第8講 ポインタと配列の学習
第2話 ソースの解説
第1話でお約束した通り、第1話のプログラムソースを解説しましょう。
#include<stdio.h>
int main()
{
char *i;
i=00000000;
printf("%p\n",i);
i++;
printf("%p\n",i);
}
stdio.hは前にも出てきました。インクルードファイルです。
これはprintf("%p\n",i);の部分を使うのに必要なファイルです。
includeはファイルの読み込みであると理解してください。
つまり、#include<stdio.h>はprintfを使うのに必要な外部ファイルを読み込んでいるのです。
main()は関数です。
関数については後に学習する予定になっていますが、
今のところは、プログラムのブロック(部品)であると理解して頂ければよいと思います。
ただし、部品と言ってもmainという名称からわかるように、メインプログラムです。
main以外のすべての関数(部品)の親玉であり、main以外の関数はすべてmainの子分です。
C言語のプログラムは、メインプログラムとサブプログラムであるmain以外の関数からなると理解していだいて結構です。
昔のBASICもメインプログラムとサブプログラムがありましたが、
各部分は独立のプログラムになっていなくて、変数の値がメインや各サブで書き換えられてしまうので、
サブプログラムやメインプログラムは、独立した部品になっておらず、全体がスパゲティのように絡み合う複雑なプログラムになっていました。
つまり、全体を理解していないとプログラムすることが不可能だったので、分業でプログラムするのがが難しかったのです。
それに対してC言語やパスカルでは構造化プログラミングが徹底していて、各部品(関数)が完全に独立しており、
変数の値が他の関数で書き換えられる心配は、全くなかったのです。
各パーツがプラモデルの部品のように完全に独立していたので、全体を理解していなくても各パーツの開発に専念できたのです。
独立した部品を組み立てて、全体をくみ上げていくプログラミングを構造化プログラミングというのです。
スパゲティプログラムであると評判の悪かったBASICもVisual Basicのなった現在では、
C言語やパスカルと同等な構造化プログラミングができるようになっています。
int main()のintの部分が気になると思いますが、今のところはmainを使うためには必要なお呪い(手続き)であると理解して下さい。
関数を学習すれば理解できますので気になさらないでください。
i=00000000の00000000はメモリの番地の0番目を示しています。
尚、メモリの番地は16進数で表されています。
だから、00000009の次は00000010ではなくて、0000000Aです。
16進数の場合、1,2,3,4,5,6,7,8,9,A,B,C,D,E,Fと0を使います。
10進数で
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,...
は16進数では
1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10,11,...となるのです。
printf("%p\n",i);は画面に表示させるために使うものです。
%□は表示させるもののタイプを示します。%pは、ポインタの出力の場合に使います。
%dなら符号付10進数、%cなら文字です。
printf("%d\n",i);を例にとると、
iがのタイプ指定にしたがって表示されるとお思いください。%dは符号付10進数ですから、i=-5なら、画面に-5と表示されます。
\nは改行を意味します。
i++;はi=i+1;の簡略表現でした。
char *i;のときはi+1で00000000が00000001になるのに対して、
int *i;のときはi+1なのに00000000が00000004になってしまうのです。
これはint型が4バイトですからi+1で次の番地が指定されると00000004となるのです。
以上の説明を読んだ上で
をも一度ご覧になれば、意味が了解できると思います。
#include<stdio.h>
int main()
{
char *i;
char a;
i=&a;
printf("%p\n",i);
*i=15;
printf("*iの値は%d\n",*i);
i++;
printf("%p\n",i);
}
と打ち1.cppというファイル名で保存し、、コマンドプロンプト上からとしエンターしてください。
そして、1エンターと打つと、と出てきます。
0030FEE0は16進数で表示されたiのアドレスです。
i=&a;の&aは変数aのアドレスを意味します。
i=&a;によってコンピュータが自動的に割り振った変数aのアドレスをiのアドレスにしているのです。
aは変数、&aは変数aのアドレスというわけですが、これは
*iは変数、iは*iのアドレスに対応しています。
つまり、対応を表にすると
&a | a |
i | *i |
となります。つまり&は変数をアドレスに変え、*はポインタ(アドレス)を変数に変えます。
&と*ではちょうど働きが逆です。
printf("*iの値は%d\n",*i);の解説に話題を変えます。
printf("*iの値は%d\n",*i);の""で囲まれた部分はそのままに出てくるのです。
それでは皆さん
int main()
{
char *i;
char a;
i=&a;
printf("%p\n",i);
*i=15;
printf("*iの値は%d\n",*i);
i++;
printf("%p\n",i);
}
をいろいろいじってどうなるか実験してみましょう。
例えば、
#include<stdio.h>
int main()
{
char *i;
char a;
i=&a;
printf("%p\n",i);
*i=15;
printf("*iの値は%d\n",*i);
printf("iの値は%p *iの値は%d\n",i,*i);
printf("i=%p *i=%d\n",i,*i);
printf("iの値は%p\n*iの値は%d\n",i,*i);
i++;
printf("%p\n",i);
}
とすると、
初心者のためのjava 入門 基礎から応用まで
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすい vb 入門 vba 入門 基礎から応用まで 第1部
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ