Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

【C言語入門】ポインタの8つの種類を徹底解説!特徴とサンプルコード付き

ポインタとは、別の変数のアドレス(メモリ上の位置情報)を格納するための特殊な変数です。C言語においてポインタは非常に重要な概念であり、メモリを直接操作できる強力な機能を提供します。

ポインタの基本構文は以下の通りです。

pointer = &variable;

C言語におけるポインタの8つの種類

C言語のポインタには、主に以下の8種類があります。

  • ヌルポインタ(Null Pointer)

  • voidポインタ(Void Pointer)

  • ワイルドポインタ(Wild Pointer)

  • ダングリングポインタ(Dangling Pointer)

  • 複合ポインタ(Complex Pointer)

  • ニアポインタ(Near Pointer)

  • ファーポインタ(Far Pointer)

  • ヒュージポインタ(Huge Pointer)

ヌルポインタ(Null Pointer)

ヌルポインタは、ポインタ宣言の時点でNULL値を代入することで作成されます。

ポインタに有効なアドレスをまだ割り当てない場合に便利な方法です。ヌルポインタは常に値「0」を保持しており、「何も指していない」状態を明示的に表すことができます。

サンプルコード

以下はヌルポインタを使用したCプログラムの例です。

#include <stdio.h>
int main(){
    int *ptr = NULL; /* ヌルポインタ */
    printf("The value inside variable ptr is:\n%d", ptr);
    return 0;
}

実行結果

上記プログラムを実行すると、次の結果が出力されます。

The value inside variable ptr is:
0

voidポインタ(Void Pointer)

voidポインタは、特定のデータ型と関連付けられていないポインタです。あらゆる型のアドレスを保持でき、必要に応じて任意の型へキャストすることができます。

「汎用ポインタ(Generic Pointer)」とも呼ばれ、標準的なデータ型を持ちません。voidキーワードを使用して作成します。

サンプルコード

以下はvoidポインタを使用したCプログラムの例です。

#include <stdio.h>
int main(){
    void *p = NULL; /* voidポインタ */
    printf("The size of pointer is:%d\n", sizeof(p)); /* サイズはコンパイラ依存 */
    return 0;
}

実行結果

上記プログラムを実行すると、次の結果が出力されます。

The size of pointer is:8

※ 表示されるサイズ(この例では8バイト)は、実行環境やコンパイラによって異なる場合があります。

ワイルドポインタ(Wild Pointer)

ワイルドポインタは「未初期化ポインタ」とも呼ばれます。初期化されていないため、メモリ上のどこか不定の場所を指した状態になり、プログラムのクラッシュや異常な動作を引き起こす恐れがあります。

この種類のポインタは信頼性に欠け、未知のメモリ領域を指すことで深刻な問題につながる可能性があるため、扱う際には十分な注意が必要です。

サンプルコード

以下はワイルドポインタを使用したCプログラムの例です。

#include <stdio.h>
int main(){
    int *p; /* ワイルドポインタ(未初期化) */
    printf("\n%d", *p);
    return 0;
}
/* 実行結果例:
Process returned -1073741819 (0xC0000005) execution time : 1.206 s
→ 出力は得られず、コンパイラによってはエラーメッセージが表示される */

その他のポインタの種類

ダングリングポインタ(Dangling Pointer)

free()関数で解放したメモリや、スコープを抜けて既に存在しない変数を指し続けるポインタです。無効なメモリ領域を参照するため、予測困難なバグの原因となります。

複合ポインタ(Complex Pointer)

複数の間接演算子(*)を組み合わせたポインタです。代表例として「ポインタのポインタ」(int **ptr)が挙げられます。

ニアポインタ/ファーポインタ/ヒュージポインタ

これらはMS-DOSなどの16ビット環境で使用されていたポインタで、セグメント単位で管理されるメモリ空間内でのアドレス指定方式の違いにより分類されます。現代の32ビット/64ビット環境ではほとんど使用されません。

まとめ

C言語のポインタは強力な機能である一方、誤った使い方をするとクラッシュやメモリ破壊といった深刻な問題を招きます。特にワイルドポインタやダングリングポインタは危険なため、宣言時には必ずNULLで初期化し、メモリ解放後にはNULLを再代入するなど、安全なポインタ操作を心がけることが重要です。

  1. Windowsのセーフモードとは?3種類のセーフモードの違いと使い分け方を解説

    この記事では、Windowsのセーフモードとは何か、そしてセーフモードにはどのような種類があるのか(通常のセーフモード、ネットワーク付きセーフモード、コマンドプロンプト付きセーフモード)について、それぞれの意味と違いをわかりやすく解説します。 多くのWindowsユーザーにとって、セーフモードは馴染みのある機能でしょう。Windowsの不具合を診断したりトラブルシューティングを行ったりする際に、セーフモードでの起動が求められることがよくあります。ここでは、セーフモードの意味と、Windowsが提供しているセーフモードの種類について詳しく見ていきましょう。 Windows 11/10におけるセー

  2. Windowsのセーフモードとは?3種類のセーフモードの違いと使い方を徹底解説

    本記事では、Windowsのセーフモードとは何か、そしてセーフモードにはどのような種類があるのか——「セーフモード」「ネットワークありのセーフモード」「コマンドプロンプトありのセーフモード」——について、それぞれの意味と違いをわかりやすく解説します。 多くのWindowsユーザーにとって、セーフモードは馴染みのある機能でしょう。Windowsの不具合を診断したりトラブルシューティングを行ったりする際に利用することが多いからです。これまでの記事では、セーフモードでWindowsを起動する方法や、セーフモードへの直接再起動の手順をご紹介してきました。今回は改めて、セーフモードの仕組みと、Wind