第9講 ポインタの学習  
第1話 ポインタとは?

C言語魅力的なものにしている理由のひとつとして、ポインタの存在があります。
ポインタの理解は、C言語の学習にとって非常に重要なものです。
すべての変数や関数はコンピュータ上のメモリー(記憶装置)上にあります。
すべてのプログラムは、メモリー上で動いているのです。
OSであるWindowsもアプリケーションソフトのワードもすべて、メモリー上で動いています。
メモリーの管理がプログラマーの大切な仕事です。
C言語は、メモリー番地を直接扱うことができる言語です。
この機能は、Visual Basicになった現在でもBasicにはありません。

メモリー番地を直接扱うとはどういう意味でしょうか。
変数を箱で喩えてきましたが、本来はデータを収納するメモリーを割り当てたものが変数です。
そして、そのメモリーには住所に相当する番地があるのです。

int i;と宣言した場合、
入門
例えば、メモリーの番地の1000から1004をiのメモリー領域にあてるのです。
int型は、4バイトなので4飛びになっています。

変数名とは、割り当てられたメモリー領域
(変数の型によって大きさが違います。例えば、int型の場合4バイトです。)
に付けられた名称です。
ただの名前にすぎずそれ自体には意味がありませんので、
禁則さえ犯さなければ自由に付けることができます。
Basicには、メモリー領域を自分で割り振ることはできません。
変数のメモリー領域は、コンピュータが自動的に割り振ります。
しかし、C言語はメモリー領域を指定したり、番地を操作したりすることができます。

それがこれから学習していくポインタです。
ポインタは、次のように宣言します。
int *a;
または
int* a;
です。
私の好みは、前者のint *a; の方です。
ですから、この講義では前者で統一したいと思います。
int *a;
と宣言したとき、実は同時に2つの変数を定義しています。
2つとは、普通の変数*aとポインタ変数aです。
*aとaの違いは何でしょうか。下の表をご覧ください。

ポインタ変数 変数
a *a
アドレスを収納する変数 内容を収納する変数

表のアドレスとは、メモリ-のアドレスです。
つまり、図に書くと次のようになります。

C
*aは、普通の変数ですから割り当てられたメモリー領域があります。
そのメモリー領域の初めの番地を収納する変数がaなのです。
もちろんaにもメモリー番地があります。

では、具体例を見てみましょう。
新規プロジェクトを作り、次のようにコーティングしてみましょう。
#include<stdio.h>
void f();
int main(){
   f();
}
void f(){
   int *i;
   int a;
   i=&a;
   *i=15;
   printf("%d\n",i);
   printf("%d\n",*i);
}
実行結果
入門
stdio.hはprintf使うために必要なインクルードファイルです。
今回coutは使いませんので、
#include<iostream>
using namespace std;
using namespace System;
入りません。
printf("%d\n",*i);は次の図をご覧ください。
初心者
符号付き10進数で表すときには、dを使うのです。

&aは変数aのアドレスを意味します。
つまり、aのアドレスをポインタ変数iに代入したのです。
そのアドレスは、1961984です。
尚、printf("%p\n",i);と変更すると
C言語
となりますが、00CF270は先ほどのアドレス1961984の16進数表示です。
そして、*iの内容が15というわけです。
すると、皆さん次の1行を加えたらどうなるか予想つきますね。
#include<stdio.h>
void f();
int main(){
   f();
}
void f(){
   int *i;
   int a;
   i=&a;
   *i=15;
   printf("%d\n",i);
   printf("%d\n",*i);
   printf("%d\n",a);
}
実行結果は30行下。

























実行結果
基礎
コード再掲
void f(){
   int *i;
   int a;
   i=&a;
   *i=15;
   printf("%d\n",i);
   printf("%d\n",*i);
   printf("%d\n",a);
}
つまり、aと*iが同じになっています。
つまり、変数aを直接使わずそれのアドレスを扱うことによってaを操作したことになります。
そして、int *i; と宣言すると普通の変数*iとアドレスを扱うポインタ変数iが同時に宣言できていることがわかります。



第8講第10話へ 第2話へ


戻る


VB講義へ
VB講義基礎へ

vc++講義へ第1部へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)