FukuRiko's WebSite

HOME | はじめに | プロフィール | フリーソフト | シェアウェア | Programming Tips | C言語 | 開発中のソフト
掲示板 | Blog | サイトマップ | 問い合せ | リンク

C言語ポイント学習

C言語初心者向けのページです。
づまづきやすい、「ポインタと配列」についてまとめてみました。
内容は少ないですが随時ふやしていきたいと思っています。
  1. 配列とポインタ(その1)
  2. 配列とポインタ(その2)
  3. 文字列・ポインタと配列
  4. 文字列と2次元配列
  5. 文字列の比較
【ポインタは難しい?】

「ポインタ=番地」とわかっていても、いざ、プログラムに
とりかかるとどうやってポインタと配列を使い分けたら良いのか?
と悩むことがしばしば....。

    例)ポインタと配列の宣言
   ┏━━━━━━━━━━━━━━━━━━┓
   ┃int *a;      <--これはポインタ。    ┃
   ┃int b[100];  <--これは配列。        ┃
   ┗━━━━━━━━━━━━━━━━━━┛

これはおそらく、ポインタの概念と実際のC言語の文法的な表記が
頭のなかで結びつかないことが原因だと思います。

   ┏━━━━━━━━━━━━━━━━━━━━━━━━━┓
   ┃・*(アスタリスク)がついているから「ポインタ」  ┃
   ┃・[](かぎ括弧)がついているから「配列」        ┃
   ┗━━━━━━━━━━━━━━━━━━━━━━━━━┛

という、機械的な覚え方をしていませんか?
それでも、問題はないのですが機械的な覚え方では実際のプログラムでは
役に立たないことが多いのではないでしょうか?


 
【内容の理解】  

例の int *a; という宣言は
「a というポインタ変数(番地を格納するための変数)」を宣言しているのです。
つまり、表記の仕方としては

   (表記1) int  *a;
   (表記2) int*  a;

(表記1)も(表記2)も同じ意味なのです。
しかし、ポインタ変数の扱いに慣れていないうちは
(表記2)のようにした方が良いでしょう。
そのほうが
「a という変数があって → その変数は int* (intへの番地)が格納される型である」
ということが明示的に理解できるからです。

→ 参考書などでは (表記1) の書き方が多いようです。
その方が都合が良い場合があるからです。
下記のような宣言をした場合に違いが出てきます。

例)  int*  a,b;

例は 
   ・変数aは「ポインタ型の変数」
   ・変数bは「int型の変数」
として解釈されてしまいます。

変数a・b両方ともポインタ型の変数として解釈させたい場合は

  int  *a,*b;

と表記すれば可能です。もちろん

  int*  a;
  int*  b;

と表記すれば、同じ意味ですから。ポインタに慣れていないうちは(表記2)のように
しておいた方が無難でしょう。

 
【今回のまとめ】  


    ┏━━━━━━━┓
    ┃1) int  *a;   ┃
    ┃2) int*  a;   ┃
    ┗━━━━━━━┛

  1) と 2) は同じ意味である。

変数aは番地(アドレス)を格納するための変数。
つまり、下記のように扱える。

パターン1)

    int*  a;
    int   b;

    a = &b;  /* int型変数bの番地がaに代入される。 */
    b = 546;
    printf("*a = %d\n", *a);

ポインタ変数の頭に * をつけると番地の内容を示すので、上記のようにすると

   *a = 546

と表示される。(変数bと同じ内容)


パターン2)

   int*  a;
   int   b[100];

   a = &b[0];  /* int型の配列bの先頭アドレスが a に代入される。*/
               /* ちなみに、配列は[]を省略すると番地を示すので   */
               /*     a = b                                        */
               /* と表記しても同じ。                               */