第9講 箱の住所を入れる箱(ポインタ)
第5話 なぜポインタは配列のように使えるの?
前々話の疑問に答えましょう。
int *a;
a=(int *)malloc(8);
によって、
箱がメモリー番地005E3EC0上に2つ設置されました。
比喩でなく、正確に語ると*aのメモリー領域として、
005E3EC0~005E3EC7までが割り当てられました。
そして、*aはint型で4バイトですから、
2個の箱が用意されたことになります。
*a | 1つ目の箱 | 2つ目の箱 |
a | 005E3EC0 | 005E3EC4 |
配列宣言
int a[1];
の場合も
a[i] | a[0] | a[1] |
アドレス | 005E3EC0 | 005E3EC4 |
のようにアドレスが割り振られるので、
配列とメモリー割り当ては同様です。
それで、配列と同じようにポインタが使えます。
では、ポインタと配列は同じかと申しますと、
違います。
ポインタの方は、アドレスを入れる箱aも同時にもっていますので、
アドレスを直接操作することができ、
配列より、より応用範囲が広いといえます。
第3話の具体例に沿って説明しましょう。
#include<stdio.h>
#include <stdlib.h>
int main(){
int *a;
a=(int *)malloc(8);
printf("%p\n",a);
*a=8;
printf("%d\n",*a);
a++;
printf("%p\n",a);
*a=10;
printf("%d\n",*a);
}
aは最初、初期化
a=(int *)malloc(8);
によってa=005E3EC0
となっています。
a++; すなわち a=a+1; によって
a=005E3EC4
となるます。int型なので、a=a+1;
によって4加えられるのでしたね。
*a | 1つ目の箱 | 2つ目の箱 |
a | 005E3EC0 | 005E3EC4 |
つまり2つ目の箱のアドレスになります。
*a=10;
によって、2つ目の箱に10が収納されます。
配列は、アドレスを入れる箱をもっていませんので、
アドレスをa++; のようにして直接操作することができません。
それに対して、ポインタはアドレスを直接操作できるのです。
では、ポインタを利用して、
を実現するプログラムを考えてください。
第4話へ 第6話
初心者のためのjava 入門 基礎から応用まで
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第1部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第2部
初心者のための VC++による C言語 入門 C++ 入門 基礎から応用まで第3部
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
VC++入門
VBA入門
専門用語なしのVBA入門
VB入門
初心者のためのEclipseによるJava入門