ポインタ変数とは 変数のアドレスを格納するための変数のことです
ポインタ変数とは 変数のアドレスを格納するための変数のことです
はいっ、引き続きアレサです。
今日はポインタ変数についてお話していきたいと思います。(^^)/
ポインタ変数とは 変数のアドレスを格納するための変数です。
まず
(ここでは例として)変数aの変数宣言
をおこないます。
次に
ポインタ変数宣言をおこないます
そうしてポインタ変数をつくると
そのポインタ変数の中に変数aのアドレス(住所)
を格納することができます。
つまり『&a』(変数aのアドレス)をポインタ変数に
格納することができるわけです。
ポインタとは英語でpointer(指し示すもの)という意味であり
変数aのアドレスを格納したポインタ変数は
変数aのアドレスのメモリを指し示しているというわけです。
では実際に
その変数のアドレスを格納できるポインタ変数を宣言してみましょう。
ポインタ変数を宣言するには
ポインタ変数にしたい自分で選んだ任意の半角英数字の前に
*(アスタリスク)をつけることから始まります。
*印はそのあとにつづく文字をポインタ変数とするためにつけられるのです。
例えば
ポインタ変数宣言は次の例のようになるわけです。
int* pta; ( この場合ptaがポインタ変数として宣言されています。)
int* neko; (この場合nekoがポインタ変数として宣言されています。)
あるいは
int *pta; ( この場合ptaがポインタ変数として宣言されています。)
int *neko; (この場合nekoがポインタ変数として宣言されています。)
のように記述します
どちらの記述方法でもかまいません
ポインタ変数ptaも変数であるので
ポインタ変数ptaを収める型というものが存在します
この例では、ポインタ変数は
int* 型(イントアスタリスク型)に格納されています
int* pta;
は
int* 型(イントアスタリスク型)のポインタ変数宣言が
おこなわれているというわけです
ここで注意するのは
今までは変数aが整数の値を格納するなら
int a;とint 型を
変数bが実数の値を格納するなら
float b;とfloat 型を
というように
変数aやbに収められる数値の種類によって
つまり
整数値か実数値であるか
によって
変数宣言で使われる
変数の型が
int
や
float
のように
決められてきました。
ですが、
ポインタ変数の型は
ポインタ変数におさめられる数値の種類によって
ポインタ変数が格納される変数の型がきめられるわけではありません。
そもそもポインタ変数に格納されるのは変数のアドレスなので
格納されるのは常に整数値であり
(%pをもちいてprintf出力表示した場合)16進数の数値となっています
それではどのように
ポインタ変数の型はきめられるのでしょうか?
その仕組みはどのようなものになっているか・・というと
それは
int型の変数aのアドレス(&a)をポインタ変数ptaに格納するのなら
int* pta; (ここではptaがポインタ変数宣言されています。)
(int *pta;)
と
int* 型にポインタ変数ptaを格納するというきまりになっています。
つまり
ポインタ変数ptaがとりうる数値の種類(実数か整数)によって
ポインタ変数ptaを格納する変数の型が決まっているわけではなく
変数aが格納されている変数の型によって
ポインタ変数ptaを格納する変数の型が決まっているというわけなんです。
同様に
float型の変数bのアドレス(&b)をポインタ変数に格納するのなら
次のように
float* ptb; (ここではptbがポインタ変数宣言されています。)
(float *ptb;)
とfloat*型(フロートアスタリスク型)にポインタ変数ptbを格納するきまりとなっています。
同様に
char型の変数cについているアドレス(&c)をポインタ変数に格納するのなら
次のように
char* ptc; (ここではptcがポインタ変数宣言されています。)
(char *ptc;)
とchar*型(キャラアスタリスク型)にポインタ変数ptcを格納するきまりとなっています。
それでは
実際にプログラムを構成してポインタ変数に
変数aのアドレスが格納されていく様子をみていきましょう。
#include <stdio.h>
int main(void){
int a=1;
int* pta;//int *pta;でも実行可能です
printf("変数aのアドレスは%pです。\n",&a);
pta=&a;
printf("ポインタ変数ptaに格納された変数aのアドレス&aの値は%pです。\n",pta);
return 0;
}
コンパイル結果
EAZY IDECの場合
変数aのアドレスは0019FF54です。
ポインタ変数ptaに格納された変数aのアドレス&aの値は0019FF54です。
Visual Studioの場合
変数aのアドレスは0086FCB8です。
ポインタ変数ptaに格納された変数aのアドレス&aの値は0086FCB8です。
アレサ
「まず このプログラムにおいては
変数aのint型の変数宣言
int a;
と
ポインタ変数ptaのint*型の変数宣言
int* pta;(int *pta;)
を実行しています。
そして&aによって変数aのアドレスを取得し
pta=&a;と
ポインタ変数ptaに変数aのアドレス&aを代入しているわけです。
ここで
*pta=&a;と*印をつける必要はありません。
*印はptaのポインタ変数宣言の時
ptaをポインタ変数とするためだけにつけられるので
ポインタ変数は*ptaでなくptaだからです。
ポインタ変数ptaに変数aのアドレス&aを代入した後は
printf関数をもちいて
ポインタ変数ptaを%p出力変換指定子をつかってprintf出力表示すれば
ポインタ変数ptaに格納された
変数aのアドレス(&a)が
16進数で
コマンドプロンプト画面にprintf出力表示されます。
ここでprintf出力表示される変数aのアドレス&aの値は
(EAZY IDECの場合)
0019FF54
となっていますが
このアドレスの値は みなさんが
お使いのパソコンやコンパイラによってことなってきます。
ポインタ変数について
うまく説明できましたですの?むずかしかったかな?
🌞|📀🌞|📀🌞|📀🌞|📀🌞|📀🌞|📀🌞|📀🌞|📀
ポインタ変数の変数名にはptaやptbだけでなく
任意の半角英数字で名前をつけることができますが
普通の変数と区別がつかないような名前は付けないほうがよいとおもわれます。
もし
変数宣言、初期化 int a=1;をおこなったあと
変数aのアドレス&aを格納するために
ポインタ変数名をbとし
ポインタ変数宣言をおこなったら
どのようになるかを次のプログラムで観察してみましょう、
#include <stdio.h>
int main(void){
int a;
int* b;
printf("変数aのアドレスは%pです。\n",&a);
b=&a;
printf("ポインタ変数bに格納された変数aのアドレス&aの値は%pです。\n",b);
return 0;
}
コンパイル結果
(EAZY IDECの場合)
変数aのアドレスは0019FF54です。
ポインタ変数bに格納された変数aのアドレス&aの値は0019FF54です。
うまくコンパイルできています。
別に問題はなさそうにみえます
ふふっ
ここであらたに
変数宣言 int c=2
変数宣言 int d=3
をおこない
それぞれのアドレス
&cと&dをポインタ変数に格納していきましょう。
&cと&dのアドレスを格納するために
それぞれに対応する
ポインタ変数名がeとfのポインタ変数宣言
int* e;
と
int* f;
をおこないます。
では、
これらの変数、ポインタ変数をもちいて
プログラムを構成してみましょう。
#include <stdio.h>
int main(void){
int a;
int c;
int d;
int* b;
int* e;
int* f;
b=&a;
e=&c;
f=&d;
printf("変数aのアドレスは%pです。\n",&a);
printf("変数cのアドレスは%pです。\n",&c);
printf("変数dのアドレスは%pです。\n",&d);
printf("ポインタ変数bに格納された変数aのアドレス&aの値は%pです。\n",b);
printf("ポインタ変数eに格納された変数cのアドレス&cの値は%pです。\n",e);
printf("ポインタ変数fに格納された変数dのアドレス&dの値は%pです。\n",d);
return 0;
}
(EAZY IDECの場合)
コンパイル結果
変数aのアドレスは0019FF54です。
変数cのアドレスは0019FF50です。
変数dのアドレスは0019FF4Cです。
ポインタ変数bに格納された変数aのアドレス&aの値0019FF54です。
ポインタ変数eに格納された変数cのアドレス&cの値は0019FF50です。
ポインタ変数fに格納された変数dのアドレス&dの値は0019FF4Cです。
ここでも めでたくコンパイルできています。
めでたし、めでたし😊
👇
👇
👇
かぽ~ん とん
かぽ~ん とん
ようこそ、この東屋へ
どうぞ ごゆっくり・・・
お抹茶と羊羹をご用意いたしております。
優雅なひと時をおすごしください. . . . . . .
ところで皆さん ここで質問のコーナーです
変数dのアドレスを格納するポインタ変数は何だったでしょうか?
わっかるかな~
ここで
変数dのアドレスを格納するポインタ変数をptdにしておけば
変数dのアドレスを格納するポインタ変数はptdと
すぐにわかります。
では次の質問です。
変数cは普通の変数だったでしょうか?
それともポインタ変数だったでしょうか?
わっかる~かな?
これも普通の変数はc,ポインタ変数はptcとしておけば
簡単にわかることでした。
このように
変数とポインタ変数を同時に多数用いる場合
ポインタ変数名
と
変数名
を
似たようなeやfのように記述すると
ポインタ変数と普通の変数と区別がつかなくなります
まぎらわしすぎる・・・
そこでポインタ変数には
pteやptfのようにptをつけるなどのルールをきめておくのが良いと思われます
solarplexussより
🐤
🐓🐓🐓
おまけのコーナー
みなさん
ときどき
charへのポインタという言葉を聞くことがありませんか?
charへのポインタとは
char型の変数のアドレスを格納するポインタ変数のことです
なぜ
charへのポインタと
いわれているのでしょうか?
例えば
char a;
を実行して
char型の変数aを作製したとします
変数aには数値データ1が代入されているとします
次に
char* pta;
によって生成されるchar*型のポインタ変数ptaを生成したとします
このchar型の変数aのアドレスは
char*型のポインタ変数ptaに
pta=&aのように代入することができます
そのことを図示すると以下のようになります
👇
https://solarplexusssolarplexusss.blogspot.com/2020/05/blog-post_4.html
ポインタとは
英語では
pointerと記述されます
pointは点という意味もありますが
動詞で指さすという意味もあります
そして
pointerには指し示すもの
という意味があります
つまり
char*型のポインタ変数は
char型の変数を指し示すもの
なのです
そして
ptaはchar*型のポインタ変数です
という日本語を英訳すると
pta is pointer to variable of char type
となります
is
は
です
pointer
は
ポインタ
to
は
~への
variable
は
変数
type
は
型
char typeはchar型
という意味です
ですので
pta is pointer to variable of char type
を
日本語に再翻訳すると
ptaはchar型の変数へのポインタです
となります
略して
ptaはcharへのポインタ変数です
と呼ばれることになるわけです
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます