ポインタの基礎文法
C 言語のポインタを理解する の基本文法を説明します。
文法の基本は、宣言と使う場所で異なります。
言葉なんで実体とかは中身だと覚えてもいいと思います。
要は、* は XXXX と定義して覚えることで、考える際の立ち位置を明確にして、自分自身が混乱しないようにします。
とあると、
a = 1
*ap = 1
**app = 1
***appp = 1
****apppp = 1
と出力されます。
この a, ap, app, appp, apppp の関係を図示すると以下のようになります。

← 読んだらプチっとお願いします。
文法の基本は、宣言と使う場所で異なります。
- 宣言
- は、* をつけるとポインタです。
ポインタ変数がある場所を示すポインタは ** と 2 個 * を書くことで表現します、なので何個つけても基本的には問題ありませんが、通常プログラムを書く上では、** の 2 つくらいまでしか使わないと思います。 - 使う場所
- は、
- * がつくと実体(ポインタが指す先)。
& がつくと場所(ポインタ)
と定義しちゃっていいと思います。
言葉なんで実体とかは中身だと覚えてもいいと思います。
要は、* は XXXX と定義して覚えることで、考える際の立ち位置を明確にして、自分自身が混乱しないようにします。
int a;
int *ap;
int **app;
int ***appp;
int ****apppp;
a = 1;
ap = &a;
app = ≈
appp = &app;
apppp = &appp;
printf("a = %d \n", a);
printf("*ap = %d \n", *ap);
printf("**app = %d \n", **app);
printf("***appp%d \n", ***appp);
printf("****apppp = %d \n", ****apppp);
とあると、
a = 1
*ap = 1
**app = 1
***appp = 1
****apppp = 1
と出力されます。
この a, ap, app, appp, apppp の関係を図示すると以下のようになります。

ポインタの基礎概念
C 言語のポインタを理解する の基本概念を説明します。
概念の基本は、
とあると、以下のようなメモリ空間(変数の値はメモリ上にある)に a と ap があるイメージは、

です。
ポインタの概念は、実体と場所 の関係を理解することが重要で、右側のメモリ空間が実体が入る入れ物で、左側の 0x から始まる数字がメモリ上の場所を表しております。
とシンプルに考えます。
「変数の宣言」と「値の代入」とは、メモリ上で
個人的には、複雑なことを考えず、常に基本はココにあると思っていれば、思い悩む必要なくなるって思ってます。
← 読んだらプチっとお願いします。
概念の基本は、
int a;
int *ap;
a = 1;
ap = &a;
とあると、以下のようなメモリ空間(変数の値はメモリ上にある)に a と ap があるイメージは、

です。
ポインタの概念は、実体と場所 の関係を理解することが重要で、右側のメモリ空間が実体が入る入れ物で、左側の 0x から始まる数字がメモリ上の場所を表しております。
- 実体
- メモリの中に収められるのが値が実体です。このときポインタ変数には 場所(ポインタ)の値が実体として入ります。
- 場所(ポインタ)
- メモリ上の場所を示すのが場所(ポインタ)です。
とシンプルに考えます。
「変数の宣言」と「値の代入」とは、メモリ上で
- 変数の宣言はメモリ上に場所を確保すること
- 変数の宣言 (int a; とか int *ap; とか) は、メモリ空間に変数(入れ物)という場所を確保することです。だから、a と ap という変数が用意されます。a の変数が用意されるイメージが青で、ap の変数が用意されるイメージが赤です。このときの入れ物(変数)の大きさが int とか int* とかで変わります。
- 値の代入はメモリ上の場所に値を入れること
- 値の代入は、a = 1; で青の変数に 1 が代入されます。ap = &a; で赤の変数に 0x04 という「a があるメモリ上の場所」が代入されます。
個人的には、複雑なことを考えず、常に基本はココにあると思っていれば、思い悩む必要なくなるって思ってます。
C 言語のポインタを理解する
C言語のポインタについてです。
昔から、C言語を覚えようとしたときの最初の山といわれる概念です。C言語からじゃなくてアセンブラから勉強をはじめれば悩むことはないでしょうね。こんな事書いている私もはじめて出会ったときは、こいつ何者?と思い、大学で先生に聞いたら、「住所のようなもの」と言われ、さらに「こいつら何者?」と思った記憶があります。今なら、「住所のようなもの」と言われれば、確かにそうだな、と思いますが、それで「わからない」→「わかる」に変わるとは思えません。
なので、私なりにわかるように説明しようかと...「Cのポインタ」を!
昔から、C言語を覚えようとしたときの最初の山といわれる概念です。C言語からじゃなくてアセンブラから勉強をはじめれば悩むことはないでしょうね。こんな事書いている私もはじめて出会ったときは、こいつ何者?と思い、大学で先生に聞いたら、「住所のようなもの」と言われ、さらに「こいつら何者?」と思った記憶があります。今なら、「住所のようなもの」と言われれば、確かにそうだな、と思いますが、それで「わからない」→「わかる」に変わるとは思えません。
なので、私なりにわかるように説明しようかと...「Cのポインタ」を!
- 基礎
- ポインタの基本構造です。どうポインタを使うかというより、ポインタを使いこなすために、ポインタとはこういうことだという定義をしっかり身につける必要があります。また、よくわからなくなった時に、この基本にさえ立ち戻れば全て必ず解決できるというよりどころにもなります。
- 概念 (ポインタの基礎概念)
- 実体と場所って何?ってのを図解して説明します。まずは実体と場所がどういう関係なのかを理解します。
- 文法 (ポインタの基礎文法)
- 概念で説明したことを C 言語でどう表現するかを理解します。
難しいだのとやかくいってもポインタには「実体」と「場所(実体を指し示すもの)」の 2 つしか存在しないのですから。 - 概念 (ポインタの基礎概念)
- 応用
- 型とポインタ (型とポインタ)
- 基礎編では例として全部 4 byte で説明していますが、変数の型によって型は大きさが変わり、ポインタは固定です。この関係を説明します。
- 文字列 (文字列とポインタ)
- 最初に出てくるポインタって文字列が多いんじゃないかな?これだけ char のポインタではなく、文字列なんて固有名詞で呼ばれる方が多いですが、結局はポインタです。文字列をポインタの基礎と照らし合わせどうなっているかを説明します。
- 配列とポインタ (配列とポインタ)
- ポインタを理解する上では、一番素直に理解できる関係だと思います。ただ、ポインタ型に対して 足し算引き算がちょっと他の振る舞いと違うので、説明しておきます。
- 関数の引数 (工事中)
- 関数を呼び出す際、引数をポインタ型にして、関数内で値を設定する、いわゆる出力引数を説明します。こう書き方すれば出力引数になるって話じゃなく、出力引数がどういう仕組みで動いているかまで説明します。
- 関数ポインタ (工事中)
- いつも使おうとすると文法が思い出せず、サンプル引っぱってくるやつです。関数自身がポインタってところが、ポインタを正しく理解していないと、いまいちピンとこない原因でしょう。正しく理解すればプログラムの全ては、命令は値とアドレスしか扱わないという単純な構造で理解できるはずです。
- malloc (new) (工事中)
- メモリ確保するときに使うんだけど、まあ気にしない人はメモリを確保してくれる魔法の関数だ!くらいに思っていると思います。ただこれもプログラムです。仕組みに従って動いているので、その仕組みを説明します。この仕組みが理解できればポインタがわからないなんてことはないはずです。
- ハンドル (工事中)
- 正式な呼び名かどうか微妙ですが、ポインタのポインタを利用してハンドルという概念が使われることがよくあります。この仕組みもよく理解せず使っている人が多いと思いますので、ハンドルの概念と仕組みを説明します。
基礎を理解した上で、そのポインタがどのように使われているかを実例をもって説明します。
プログラムを書いているとよく出てくるポインタの利用場面がどういう仕組みで動いているのか説明してポインタの理解度を深め、知っている概念から使いこなせる概念に変えます。
応用編は、基本的なことから知らなくてもプログラム書けるよ!って感じの上級編まで説明してみようかと思います。
← 読んだらプチっとお願いします。 - 型とポインタ (型とポインタ)