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

CCBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

ヌルポインタは、どのメモリアドレスも指し示さないポインタです。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

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/BasicsGroup(["Basics"]) c(("C")) -.-> c/ControlFlowGroup(["Control Flow"]) c(("C")) -.-> c/CompoundTypesGroup(["Compound Types"]) c(("C")) -.-> c/PointersandMemoryGroup(["Pointers and Memory"]) c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) c/BasicsGroup -.-> c/variables("Variables") c/ControlFlowGroup -.-> c/for_loop("For Loop") c/CompoundTypesGroup -.-> c/arrays("Arrays") c/CompoundTypesGroup -.-> c/strings("Strings") c/PointersandMemoryGroup -.-> c/pointers("Pointers") c/PointersandMemoryGroup -.-> c/memory_address("Memory Address") c/UserInteractionGroup -.-> c/user_input("User Input") subgraph Lab Skills c/variables -.-> lab-123293{{"C 言語のプログラミングにおけるヌルポインタの使用"}} c/for_loop -.-> lab-123293{{"C 言語のプログラミングにおけるヌルポインタの使用"}} c/arrays -.-> lab-123293{{"C 言語のプログラミングにおけるヌルポインタの使用"}} c/strings -.-> lab-123293{{"C 言語のプログラミングにおけるヌルポインタの使用"}} c/pointers -.-> lab-123293{{"C 言語のプログラミングにおけるヌルポインタの使用"}} c/memory_address -.-> lab-123293{{"C 言語のプログラミングにおけるヌルポインタの使用"}} c/user_input -.-> lab-123293{{"C 言語のプログラミングにおけるヌルポインタの使用"}} end

ヌルポインタを宣言する

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

#include <stdio.h>

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

空のポインタを宣言する

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

#include <stdio.h>

int main() {
   void *ptr;    // ptr は空のポインタです
   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 言語のプログラミングでそれをどのように使用するかを学びました。ヌルポインタと空のポインタを宣言する方法、およびポインタ配列の終端を示すためにヌルポインタをどのように使用するかを見ました。また、ユーザー入力を許可し、ヌルポインタを使用して名前を検索するようにプログラムをカスタマイズする方法も学びました。プログラムでヌルポインタを使用することで、プログラムをより堅牢にし、一般的なエラーを回避することができます。