C言語 ポインタ 分かりやすい解説!!
C言語を使っていく上でポインタでつまづく人って多くないですか?
ポインタってなんだか複雑で難しいですよね。
ですがポインタを使えるとC言語の幅が広がります!すごく便利です
この記事ではポインタについて解説して生きます!
C言語ポインタとは
ポインタとは変数を直接利用するのではなく、変数が格納されているアドレスを記憶している変数のことを指します。
変数を宣言すると、その変数が記憶領域に格納されます。その格納された場所のアドレスを参照することで、変数の値を使うことができるのがポインタです。
C言語ポインタ メリット
なんでアドレスを使って変数を取得する面倒なことをするのか?という話ですが、ポインタを利用することで様々なメリットがあります。
メモリの節約
コンピュータの記憶領域はもちろん有限です。そのため冗長的にコードを書くと容量に限界がきてしまいます。初心者の方はあまりメモリについて考えてコードを書くことはないかもしれませんが、大きなプログラムを書く際にはここが重要になります。
例えば、変数xをポインタを使わずに値で受けわたすとします。他の関数にこの値を受けわたす際、別のメモリにコピーをしなければいけません。
x=10とかの値を渡す場合はいいのですが、配列を渡そうとすると要素全てをコピーしなければならないため、非常に大きなメモリを消費してしまいます。
しかし、ポインタを利用すれば、先頭のアドレスだけをコピーすればいいのです。そのため、構造体や配列を使う場合にはポインタを使って他の関数に値を渡すことが理想的ということになります。
他の関数への値の受け渡しに使うとメモリが節約できていいよ!ということです
コードの簡素化
C言語では構造体や配列、関数を扱う際によくポインタが用いられます。
ポインタを使ってコードを書くことにより非常にコードがわかりやすくなります。
また同じポインタを使いまわして複数の関数を利用することも可能になります。
慣れるまでは難しいですがなれてしまうと非常に便利なものだと気づくはずです!
C言語 ポインタの使い方
ポインタの宣言方法は、変数名の頭に「*」をつけてあげます。たったこれだけでポインタの宣言が完了します
そして通常の変数のアドレスを取得する際には変数名の頭に「&」をつけてあげます。ここで取得したアドレスをポインタ変数に入れてあげることでポインタとして使えるようになります。
以下のように宣言を行います
もちろんint以外にも全ての変数の型で利用可能です。
C言語 ポインタ 配列
配列については以下のページで解説しています。
ポインタを使うにあたって変数が配列の場合はどうなるか見て行きましょう。
配列として宣言してもポインタとして利用することができます。
上記で説明した通常の変数と同様に、「*」を付けるだけです。使用する際は「&」をつけるだけです。
このように通常の変数と同様に宣言をすることができます。
[0]としているのは配列の先頭のアドレスをとるためです。特定の配列の要素を指定したい場合は中身を変更するだけです。
配列全体を使いたい場合は[0]と「&」を省略して以下のように記述することもできます
こうすると配列の先頭のアドレスを取得することが可能になります。[0]を入れた場合と同じ動きをしてくれます。
C言語 ポインタ 構造体
構造体もポインタとして利用することが可能です。通常の構造体とは少し使い方が変わってくるので注意が必要です。
普通に宣言された構造体のメンバ変数にアクセスする場合は「.」を使います。
しかしポインタで宣言された構造体のメンバ変数にアクセスするには「->」を使用します。
以下に簡単な例を示します。
ちょっと難しくなってきたと思いますが、形を真似て自分でコードを書いてみると理解が深まります。
構造体の定義は違った形もあると思いますがこの形でもできますという例です。
C言語 ポインタ 関数
関数ポインタは関数が格納されているメモリのアドレスを取得するものです。アドレスを変えるだけで様々な関数を参照することができるものです。
使いたい関数に合わせて動的に変更することができるのです。
「typedef」を使って関数ポインタを宣言します。
typedef 戻り値の型(*関数ポインタ名)(引数);
という感じです。
下記に簡単な例を示します。
宣言が複雑ではありますが非常に便利になります。
ほとんどコードを変えずに別の関数に飛ばして結果を得ることができるて便利です。
また処理が関数化されていて非常にわかりやすいコードになります。
まとめ
この記事ではポインタについてまとめました。
ポインタは慣れていない人からすると複雑ですよね。実際にわたしも「アドレス」という言葉を聞くとめんどくさ!!と思っていました。
しかし配列、関数、構造体を非常に扱いやすくしてくれるため、便利だと思います。
C言語の中では難しいポインタですが、使えるようになるととても便利なので使いこなせるように頑張りましょう!
この記事が少しでも役に立ったら幸いです!