C 言語のプログラミングにおけるヌルポインタの使用

CBeginner
オンラインで実践に進む

はじめに

ヌルポインタは、どのメモリアドレスも指し示さないポインタです。C 言語のプログラミングでは、ヌルポインタはヘッダファイル stdio.h に定義されている定数 NULL で表されます。ヌルポインタを使用することで、エラーを回避したり、C プログラムに機能を追加したりすることができます。

この実験では、ヌルポインタについて学び、C 言語のプログラミングでそれをどのように使用するかを学びます。配列内の名前を検索するためにヌルポインタを使用するプログラムを作成します。

注:コーディングを練習し、gcc を使用してコンパイルおよび実行する方法を学ぶには、自分で~/project/main.cファイルを作成する必要があります。

cd ~/project
## main.cを作成する
touch main.c
## main.cをコンパイルする
gcc main.c -o main
## mainを実行する
./main

ヌルポインタを宣言する

C 言語のプログラミングでは、ヌルポインタは何も指し示さないポインタです。ヌルポインタを宣言するには、ポインタ変数に NULL の値を割り当てることができます。

#include <stdio.h>

int main() {
   int *ptr = NULL;    // ptr はヌルポインタです
   return 0;
}

空のポインタを宣言する

void ポインタとは、特定の型を持たないポインタのことです。あらゆる型のデータを示すために使用できます。void ポインタを宣言するには、アスタリスク(*)の前にキーワード void を使用します。

void ポインタを間接参照したり、ポインタ演算に使用したりする前に、他のデータ型にキャストする必要があります。

#include <stdio.h>

int main() {
   int n = 10;
   void *ptr = &n; // ptr は int を指す void ポインタ
   printf("Value of n: %d\n", *(int*)ptr); // 間接参照する前に int ポインタにキャスト
   return 0;
}

ポインタ配列の終端を示すためにヌルポインタを使用する

C 言語のプログラミングでは、ポインタ配列の終端を示すためにヌルポインタを使用することができます。これは、配列内の名前やその他のデータを検索する際に便利です。

#include <stdio.h>
#include <string.h>

int search(char *ptr[], char* name);

char *names[] = {
    "John",
    "Peter",
    "Thor",
    "Chris",
    "Tony",
    NULL
};

int main(void)
{
    if(search(names, "Peter")!= 1)
    {
        printf("Peter is in the list.\n");
    }

    if(search(names, "Scarlett") == -1)
    {
        printf("Scarlett not found.\n");
    }

    return 0;
}

// 検索関数を定義する
int search(char *ptr[], char*name)
{
    for(int i=0; ptr[i]; ++i)
    {
        if(!strcmp(ptr[i], name))
        {
            return i;
        }
    }

    return -1;  // 名前が見つからない
}

ユーザー入力に応じてプログラムをカスタマイズする

ユーザーに配列用の名前を入力させ、名前を検索できるようにプログラムをカスタマイズすることができます。これは、C 言語のプログラミングで scanf() 関数を使用して行うことができます。

#include <stdio.h>
#include <string.h>

#define MAX_NAMES 100

int search(char *ptr[], char* name);

int main(void)
{
    char *names[MAX_NAMES];
    char name[50];
    int count = 0;

    printf("Enter names (press enter to stop):\n");

    // ユーザー入力から名前を取得する
    while(1)
    {
        scanf("%s", name);

        if(strcmp(name, "") == 0)
        {
            break;
        }

        names[count] = (char*) malloc(strlen(name)+1);
        strcpy(names[count], name);
        count++;
    }

    names[count] = NULL;    // ヌルポインタで配列の終端を示す

    // 名前を検索する
    while(1)
    {
        printf("Enter name to search for (press enter to stop):\n");
        scanf("%s", name);

        if(strcmp(name, "") == 0)
        {
            break;
        }

        int index = search(names, name);

        if(index!= -1)
        {
            printf("%s is found in index %d.\n", name, index);
        }
        else
        {
            printf("%s not found.\n", name);
        }
    }

    return 0;
}

// 検索関数を定義する
int search(char *ptr[], char*name)
{
    for(int i=0; ptr[i]; ++i)
    {
        if(!strcmp(ptr[i], name))
        {
            return i;
        }
    }

    return -1;  // 名前が見つからない
}

まとめ

この実験では、ヌルポインタについて学び、C 言語のプログラミングでそれをどのように使用するかを学びました。ヌルポインタと空のポインタを宣言する方法、およびポインタ配列の終端を示すためにヌルポインタをどのように使用するかを見ました。また、ユーザー入力を許可し、ヌルポインタを使用して名前を検索するようにプログラムをカスタマイズする方法も学びました。プログラムでヌルポインタを使用することで、プログラムをより堅牢にし、一般的なエラーを回避することができます。