【独学C言語】ポインタとは

※この記事は「2020年12月19日」に更新しました。

今回は、ポインタについて。

前回は、変数のスコープについて、解説しました。

【独学C言語】変数のスコープ

【独学C言語】変数のスコープ

2020年4月29日

ポインタは、C言語を初めて学習する方にとって、理解が難しい部分かもしれませんが、重要な部分でもあります。

なるべくわかりやすく解説していきます。

それでは見ていきましょう。

ポインタとは

ポインタとは、変数のアドレスを記憶するための変数です。

コンピュータの世界のアドレスは、メモリ上の物理的な位置を表します。

メモリは、連続して並んだ、バイトの列です。

プログラム中で、変数定義を行うと、その変数の領域が物理的にメモリ上に取得されます。

その変数の領域は、コンピュータが勝手に決めるので、メモリ上のどこに配置されているかは、その場所を示す、アドレスによって知ることができるのです。



ポインタ変数の定義

ポインタ変数の定義は以下の通りです。

データ型 *変数名;

*(アスタリスク)が付いている点に注意してください。

ポインタ演算子

C言語には、*(アスタリスク)と &(アンパサンド)という 2つのポインタ演算子があります。

* 演算子は、後に続くアドレスに格納された値を返します(関節参照)。

& 演算子は、後に続く変数のアドレスを返します。

例えば、scanf関数で整数値を読み取る場合、以下のように表現していました。

scanf("%d",&int型の変数名);

この書き方は、& 演算子で int型の変数のアドレスを指定していたわけです。

値渡しと参照渡し

C言語に限った話ではないのですが、プログラミングでは値渡しと参照渡しという言葉が使われます。

関数には、引数があります。

引数には値渡しと参照渡しという渡し方があります。

値渡しについて

値渡しの説明です。

例えば、以下のような関数の呼び出しが main関数内にあったとします。

hogehoge(herohero);

herohero は、int型の変数です。

続いて、関数の定義部分です。

void hogehoge(int hoge_herohero)
{
    hoge_herohero = hoge_herohero + 1;
}

herohero と hoge_herohero は、別の変数です。

herohero の値をコピーして hoge_herohero に渡したにすぎません(値渡し)。

したがって、herohero が、インクリメントされることはありません。

参照渡しについて

ポインタを引数に使うのは、参照渡しに近いです。

アドレス渡しといって、変数のアドレスを引数で渡すことができます。

例えば、以下のような関数の呼び出しが main関数内にあったとします。

hogehoge(&herohero);

herohero は、int型の変数です。

続いて、関数の定義部分です。

void hogehoge(int *p_herohero)
{
    *p_herohero = *p_herohero + 1;
}

このように書けば、main関数で定義された herohero の値も変更されます。

サンプルプログラム【C言語】

ポインタを理解するためのサンプルプログラムです。

sample1.c というソースファイルを作成します。

#include <stdio.h>

int main(void)
{
    int number;
    int *p_number;

    p_number = &number;

    printf("\n");

    printf("Input number : ");
    scanf("%d", p_number);

    printf("\n");

    printf("Number is %d", number);

    printf("\n\n");

    return 0;
}

ポインタ変数である p_number を定義し、number のアドレスを格納しています。

その後、scanf関数で整数値を入力し、その入力した値を出力します。

実行結果は以下の通りです。

ポインタとは

次に sample2.c というソースファイルを作成します。

#include <stdio.h>

void hogehoge(int *);

int main(void)
{
    int herohero;

    herohero = 0;

    printf("\n");

    hogehoge(&herohero);
    hogehoge(&herohero);
    hogehoge(&herohero);

    printf("herohero is %d", herohero);

    printf("\n\n");

    return 0;
}

void hogehoge(int *p_herohero)
{
    *p_herohero = *p_herohero + 1;
}

アドレス渡しを理解するためのサンプルプログラムです。

hogehoge関数を呼び出すたびに herohero がインクリメントされます。

実行結果は以下の通りです。

ポインタとは

独学C言語の記事について【おまけ】

タカフミブログの独学C言語シリーズは、C言語を独学するということを目的に記事を書いています。

他の記事に興味がある方は以下をご参照下さい。

C言語に関する記事一覧

C言語は、古典的なイメージがある方もいるかもしれませんが、他の多くのプログラミング言語のベースになっています。

実際に本格的なソフトを開発するとなるとなかなか大変ですが、とにかくハードウェアのリソースが少なくても高速に動くのが最大のメリットです。

プログラマーや SE(システムエンジニア)を目指す方は一度お試し下さい。

最後に【ポインタについて】

いかがでしょうか。

今回は、ポインタについて紹介しました。

次回は、ポインタと配列について、解説していきます。

【独学C言語】ポインタと配列

【独学C言語】ポインタと配列

2020年5月2日

少し複雑なので、混乱しやすいですが、処理を順番に正しく追っていけば理解できるかと思います。