「ポインタって何?」
「ポインタについてよくわからない、、」
そんな方に向けて、プログラムの例を出しながらわかりやすく解説します。
ポインタは難しいのでゆっくり時間をかけて正確に理解しましょう。
ポインタとは
ポインタを一言で表すと、
「変数のアドレスを格納する変数」のことです。
変数のアドレス??
と疑問を持つと思います。順に説明していきます。
変数のアドレス
これまで 「int a」や「double x」のように変数を扱ってきました。
これらはメモリの一部に保存されています。
そしてそのメモリの保存されている位置、つまり住所がそれぞれの位置にあります。
この住所のことをアドレスと言います。
変数のアドレスとは、変数が保存されている位置を表します。
変数のアドレスを格納する変数
変数のアドレスを格納する変数(ポインタ)とは、
メモリのどこに変数が保存されているのか、その場所(番地)を記憶するための変数ということになります。
早速以下のプログラムを実行して確認してみましょう。
#include <stdio.h>
int main(void) {
int a;
int *b;
printf("変数aの値を入力してください:");
scanf("%d",&a);
b=&a;
printf("変数aの中身の値は%dです\n",*b);
printf("変数aのアドレスは%pです\n",b);
return 0;
}
「b」はポインタで、「a」のアドレスを保存しています。
こちらを実行してみると以下のような結果になります。
イメージしやすいように図にしてみると、
となります。
ポインタの使い方
ではポインタについては理解できたので、使い方について解説します。
ポインタは、
変数の型 ✳︎変数名;
で扱うことができます。(✳︎を変数名の前につけます。)
これまで「int b;」と定義して変数を宣言していましたが、
ポインタを扱いたいときには、「int ✳︎b;」と宣言します。
また、アドレスを表示させたい時は、
「int a=10;」で変数とその中身を宣言していたときに、
「a」でその中身「10」を表し、
「&a」でアドレスを表します。
なので、「b」に「a」のアドレスを入れたい時は、
「b=&a;」と書きます。
ポインタのメリット
これでポインタを使うことができるようになったと思いますが、
「じゃあ何ができるの?」と思ったと思います。
そこで、「二つの数字を入力して、大きい数字を表示させる」プログラムを作成したいとします。
そこで、ポインタを習う前ではこちらのように書くと思われます。
#include <stdio.h>
void sort(int left,int right);
int main(void) {
int a;
int b;
printf("最初の数字を入力してください:");
scanf("%d",&a);
printf("二つ目の数字を入力してください:");
scanf("%d",&b);
sort(a,b);
printf("大きい数字は%dです\n",a);
return 0;
}
void sort(int left,int right){
if(left<right){
int a=left;
left=right;
right=a;
}
}
パッとみた感じは上手くいきそうですが、実行してみると
このように上手くいきません。
理由は、関数sortの中で仮の引数(left,right)の値を変更させたとしても
オリジナル(a,b)の値を変えることができません!!
そこでポインタを使うことでこの問題を解決できます!
以下のように改変することで、プログラムが正常に実行できます。
#include <stdio.h>
void sort(int *left,int *right);
int main(void) {
int a;
int b;
printf("最初の数字を入力してください:");
scanf("%d",&a);
printf("二つ目の数字を入力してください:");
scanf("%d",&b);
sort(&a,&b);
printf("大きい数字は%dです\n",a);
return 0;
}
void sort(int *left,int*right){
if(*left<*right){
int a=*left;
*left=*right;
*right=a;
}
}
関数の仮引数にポインタを使い、関数にはアドレスを入力することで、
アドレス内の中身を関数で扱うことが出来ます!
実行結果はこちらになります。
まとめ
今回は、ポインタについて解説しました!
ポインタは「変数のアドレスを格納する変数」で、「変数の型 ✳︎変数名;」で使うことが出来ます。
実際にプログラムを用いてメリットも説明しました。
他にも文字列を逆順にするという例題を解説していますので、よければこちらもご覧ください。