第9講 箱の住所を入れる箱(ポインタ)
第2話 ポインタの宣言
ポインタの宣言は、整数型であれば
int *a;
と宣言します。
これをみて、皆さんは整数の宣言とどこが違うのとか、
*って何、意味がわからないなどの感想をお持ちかと思います。
実は
int *a;
と宣言したとき、
2つの箱が用意されます。
1つ目は、普通の箱である*aです。
2つ目は、*aという箱の住所(メモリー番地)を入れる箱aです。
例えば、次のようにプログラミングしてみてください。
#include<stdio.h>
int main(){
int *a;
a=(int *)malloc(8);
printf("%p\n",a);
*a=8;
printf("%d\n",*a);
}
実行結果
a=(int *)malloc(8);は初期化といわれるもので、
*aの番地を割り振り、
確保した領域(箱の大きさ)を8バイトにする操作です。
a=(int *)malloc(8);
の1行がないと*aのメモリー番地が決まらず、
コンピュータは箱を設置できないのです。
今回はメモリー番地00BE3EC0から00BE3EC8までが
*aのデータ領域として割り振られたのです。
int型ですので8バイトの領域が割り振られるのです。
(00BE3EC0は皆さんは、
特別な記号であるとお思いになると思いますが、
普通の数字の16進数表示にすぎません。
16進数ですから16個の記号が必要になるわけですが、
0123456789の10個しか数字の場合記号がありませんので、
11番目をA、12番目をBなどしているだけです。)
箱 | |||
箱のメモリー番地 | 00BE3EC0 | 00BE3EC8 | 00BE3ECF |
ポインタの場合は、箱の住所(アドレス=メモリー番地)を直接操作できます。
箱の住所を入れる箱aも用意されているからです。
int a;
と宣言された場合、箱aがメモリー番地上に割り振られ、
箱aはメモリー番地=アドレスを持っていますが、
そのアドレスを入れる箱は用意されていません。
それに対して、
int *a;
の場合は、箱*aとそれのアドレスを入れる箱aの2つの箱が用意されるのです。
メモリー番地を操作できるようになります。
メモリー番地を入れる箱aが用意されているので、
そこから番地を取り出したり、
番地に8を加えるなどの操作ができるようになります。
この説明を聞いても、まだまだ謎に満ちていますね。
でも、次話を読むと謎はかなり解消されます。
第1話へ 第3話
初心者のためのjava 入門 基礎から応用まで
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
VC++入門
VBA入門
専門用語なしのVBA入門
VB入門
初心者のためのEclipseによるJava入門