初心者が初心者なりに、ポインタについて学習したことをまとめてみます。
間違っていたらツッコミを入れてあげてください。
はじめに
私は専門が「ActiveBasic」という言語なので、サンプルはそれで表記させていただきます。
が、C言語を参考に作られている言語でもあるため、Cへの修正は容易です。
もし、「プログラミングを勉強したいけど、何にしようかな…?」と悩んでいる方がいらっしゃいましたら、ぜひぜひActiveBasic(以降、ABとも表記)を始めてみてください!化石言語とか言わずに!!
また、サンプルでたまにCも書いてますが、実行などでの検証は行っておりません。
あしからず。
そもそもポインタとは?
諸説通り、メモリのアドレスという説明がやはり正解なのでしょうが、それではわかりにくい!!
なので私は「動的な配列」と説明しようと思います。
もちろん、メモリのアドレスという説明が正解ですが、おそらく「動的な配列」という表現のほうがとっつきやすくなると思います。
なので、あえてこれで説明しようと思います。
配列を動的に作成する!?
例えば配列変数を定義する際に、
Dim a As Long
a = 100
Dim array[a] As Long
とやると、「アホか!」と怒られます。
Cだと、
long a;
a = 100;
long array[a];
かな?
ではどうやって、配列を好きなだけ定義するか。
ここで、ポインタを使います。
Dim array As *Long '*[型]でポインタを表す(C言語も一緒)
Dim num As Long
'5つ分のLong型の配列を定義
array = malloc(SizeOf(Long)*5)
'それぞれに値を代入。もちろんForやWhileなどのループで代入してもOK
array[0] = 0
array[1] = 1
array[2] = 2
array[3] = 3
array[4] = 4
'中身の確認!
For num = 0 To 4
MessageBox(0, Str$(array[num]), "", 0)
Next
'確保した配列用のメモリを開放(mallocやcallocを使うと、必ずfreeをしないといけない)
free(array)
Cだとこう?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
/* メイン関数 */
int main(){
long *array; //Cでは、変数名の前に「*」をつけるとポインタになる
long num;
//5つ分のLong型の配列を定義
array = malloc(sizeof(long)*5);
//それぞれに値を代入。もちろんforやwhileなどのループで代入してもOK
array[0] = 0;
array[1] = 1;
array[2] = 2;
array[3] = 3;
array[4] = 4;
//中身の確認!
for (num=0; num<5; num++){
printf("%ld\n",array[num]);
}
//確保した配列用のメモリを開放(mallocやcallocを使うと、必ずfreeをしないといけない)
free(array);
}
今回は、Long型の変数を5個用意してみました。
ざっくり利用している関数の説明をば。
- malloc関数(またはcalloc関数):ポインタ用にメモリを指定した数だけ確保します
- sizeof関数:変数の型(今回だとLong型)が使うメモリ数を返します
- free関数:mallocまたはcallocで確保したメモリを開放します
このような流れになります。
結局ポインタって
動的に配列を作成できるのは、あくまでポインタの一部分の能力であり、全てではありません。
ですが、おそらくよく使うテクニックの一つではあると思います。
私はこのテクニックを知り、ポインタへの理解がぐぐぐっと深まりました。
結局ポインタとは、既存の型を利用して、その分のメモリを確保し、その「場所」の情報を持っているわけですね。
500MBのテキストデータを読み込みたい!
↓
Byte型(1つ1文字)で500MB分メモリを確保!
↓
じゃあ、その場所は「1020」ね!
の「1020」のようなアドレスをポインタ変数は持っているわけです。
様々な参考サイト様がありますが、私はhttp://effy.ldw.jp/c/pointer2.html様が一番好みでした。
もちろん人それぞれの好みですので、あくまで参考程度に。
では、今回はこのへんで。