C言語の始め方【第7回 ポインタ】※現役エンジニアによる解説

C言語ポインタ例 C言語の始め方
本ページは、プロモーションを含んでいる場合があります。
対象C言語初心者
記事概要C言語のポインタについて記載しています。
筆者Zuu [ ]

C言語歴20年以上。
大手電機メーカーでの製品開発およびマネジメント経験がある現役エンジニアです。
プロジェクトマネージャ、システムアーキテクトなどの資格を保有しています。
システムアーキテクト試験合格証書

はじめに

ポインタは、「変数」の一種です。変数についての理解が不十分だと感じている場合は、まずは変数について学びましょう。

本サイトでは、以下の記事で変数について説明しています。
よろしければご覧ください。

C言語の始め方【第2回 変数】※現役エンジニアによる解説
C言語の変数をわかりやすく解説。 変数とは、値(データ)を記憶する機能。 記憶したい値(数値や文字など)によって、型を変える。 名前で区別するため、適切な名前(用途など)を付けると良い。 変数にはローカル・グローバルという区別がある。

ポインタとは?

ポインタ (英: pointer) とは、コンピュータプログラミングにおいて、変数や関数などが置かれたメインメモリ上の番地(メモリアドレス)などを格納する特殊な変数のこと。

ポインタを一言で表すと、上記引用の通りなのですが、おそらくこれだけでは伝わらないと思いますので、もう少しわかりやすく説明していきます。

名前以外で変数や関数を識別する手段

今まで変数や関数は、名前(変数名・関数名)で識別してきました。名前で識別することは、プログラミングをしている人間にとっては非常に自然でわかりやすいですよね。

それに対して、ポインタは「名前以外で変数や関数を識別する手段」となります。ポインタ(メモリアドレス)は、人間よりコンピュータ向けの識別手段だと思ってください。ゆえに、人間にとっては少しわかりにくいのです。

メモリアドレス/番地とは、メモリ上のどこにあるかを示す情報です。碁盤の目のように区切られた中で、位置を表すものと考えていただければ問題ありません。
図で表すと、以下のような感じですね。

C言語ポインタ概要

まだポインタについてイメージがわかないという人は、タンスをイメージするとわかりやすいかなと思います。ポインタ(メモリアドレス/番地)は、タンスの1段目や2段目などの場所と同じ感じです。

C言語のポインタのイメージ

また、どこに何をしまったかをわかりやすくするために引き出しに貼り付けたラベルが、変数や関数における名前に相当します。多くに人にとっては、このようなラベルがあるとわかりやすいですよね。

名前以外で識別する手段の必要性

名前による識別ができるのに、なぜ名前以外で識別する必要があるのかと疑問に思う方もいるでしょう。それは、名前で識別する手段だけでは問題があるケースがあるためなのです。

例えば、ローカル変数は別の関数から名前でアクセスすることはできません。ですが、別の関数の変数を書き換えたくなることはよくあります。

C言語でポインタが効果的な例

もちろん、上記の問題はグローバル変数を使えば解決できます。ただし、実際の開発の現場ではグローバル変数での解決は推奨されません。

推奨されない理由としては、「関数同士の依存度が上がってしまう」ということが挙げられます。ソフトウェア開発は、関数単位で再利用することが多いため、依存度が高い関数があると再利用のハードルが上がってしまい、敬遠されてしまいます。

C言語でのポインタの扱い方

宣言

ポインタは変数の一種なので、使う場合には宣言が必要です。宣言の際、型の後、もしくは変数名の前に「アスタリスク(*)」を付与することでポインタ変数として扱うことができるようになります。

当サイトでは、変数名の前に「アスタリスク(*)」を付与する方法をおすすめします。

同じ型のポインタ変数なら、1行で複数宣言することもできます。
※型の後に付与する方法だと複数宣言できません。

代入

他の変数と同様に、ポインタ変数も代入することができます。ポインタ変数は、今までの変数と違い「メモリアドレス」を記憶する必要があるため、変数や関数のメモリアドレスを取得する必要があります。

変数のメモリアドレスを取得するには、変数名の前に「アンパサント(&)」を付与します。

ポインタ変数経由で変数にアクセスする

ポインタ変数に記憶されているメモリアドレスにある変数にアクセスするには、ポインタ変数名の前に「アスタリスク(*)」を付与します。

※宣言と同じ
※「int型」の「*p」という変数と見れば理解しやすいかもしれません。

その他に覚えておきたいこと

配列に対する使い方

ポインタは配列に対しても使うことができます。基本的には通常の型と同じように使用することができますが、少し特殊な使い方があります。

構造体に対する使い方

ポインタは構造体に対しても使うことができます。以下の記事で説明していますので、よろしければご覧ください。

C言語の始め方【第5回 構造体】※現役エンジニアによる解説
C言語の構造体をわかりやすく解説。構造体とは、複数のメンバーを1つにまとめたもの。 関連するデータのみをまとめると良い構造体になる。 通常のアクセスとポインタを使ったアクセスでメンバーへのアクセス方法が変化。 配列としても使用可能。

関数に対する使い方

ポインタは変数のみでなく、関数に対しても使うことができます。以下の記事で説明していますので、よろしければご覧ください。

C言語の始め方【第6回 関数】※現役エンジニアによる解説
C言語の関数をわかりやすく解説。関数とは、意味や内容がまとまっている作業をひとつの手続きとしたもの。 値を与えることができ、値を返すことができる。 ポインタを使って出力引数にすると、戻り値以外でも処理結果を受け取れる。

直接メモリアドレスを指定する方法

オペレーティングシステムデバイスドライバの開発などの場合に、ポインタ変数に直接メモリアドレスを代入することがあります。

ポインタ変数に直接メモリアドレスを代入する方法については、別の記事で紹介します。
しばらくお待ちください。

まとめ

  • 変数および関数に対する、名前以外での識別手段。
  • 文法が特殊。
    1. ポインタ変数の宣言は、型に「アスタリスク(*)」を付ける。
    2. 変数へのポインタを取得する場合は、変数に「アンパサント(&)」を付ける。
    3. 変数へのポインタから変数の値を取得する場合は、ポインタ変数に「アスタリスク(*)」を付ける。
    4. 関数へのポインタは、「アンパサント(&)」はなくても良い。
C言語の始め方【第8回 ファイル操作】※現役エンジニアによる解説
ファイルの概要およびC言語でのファイル操作について解説。ファイルを使用すると、プログラムが終了しても値を覚えておくことが可能。操作関数には、オープン/クローズ、読み込み/書き込みなどがあり、テキストファイルとバイナリファイルで使用する関数が変化。
C言語の始め方(初心者向けC言語講座)
C言語歴20年以上の現役エンジニアがC言語について説明しています。 重要なポイントを学習しやすい構成にしているつもりです。 変数、分岐処理、反復処理、・配列、構造体、関数、ポインタ、ファイルの取り扱い、など。ポインタの理解に主眼を置いています。

コメント

タイトルとURLをコピーしました