LoginSignup
6
7

More than 5 years have passed since last update.

初心者のためのポインタ講座 ~ポインタって結局なんの役に立つの?~

Last updated at Posted at 2015-04-18

初心者が初心者なりに、ポインタについて学習したことをまとめてみます。
間違っていたらツッコミを入れてあげてください。

はじめに

私は専門が「ActiveBasic」という言語なので、サンプルはそれで表記させていただきます。
が、C言語を参考に作られている言語でもあるため、Cへの修正は容易です。
もし、「プログラミングを勉強したいけど、何にしようかな…?」と悩んでいる方がいらっしゃいましたら、ぜひぜひActiveBasic(以降、ABとも表記)を始めてみてください!化石言語とか言わずに!!

また、サンプルでたまにCも書いてますが、実行などでの検証は行っておりません。
あしからず。

そもそもポインタとは?

諸説通り、メモリのアドレスという説明がやはり正解なのでしょうが、それではわかりにくい!!
なので私は「動的な配列」と説明しようと思います。
もちろん、メモリのアドレスという説明が正解ですが、おそらく「動的な配列」という表現のほうがとっつきやすくなると思います。
なので、あえてこれで説明しようと思います。

配列を動的に作成する!?

例えば配列変数を定義する際に、

ActiveBasic
Dim a As Long
a = 100
Dim array[a] As Long

とやると、「アホか!」と怒られます。
Cだと、

C
long a;
a = 100;
long array[a];

かな?

ではどうやって、配列を好きなだけ定義するか。
ここで、ポインタを使います。

ActiveBasic
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だとこう?

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様が一番好みでした。
もちろん人それぞれの好みですので、あくまで参考程度に。

では、今回はこのへんで。

6
7
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7