Использование нулевого указателя в программировании на C

CBeginner
Практиковаться сейчас

Введение

Нуль-указатель - это указатель, который не указывает на какой-либо адрес в памяти. В программировании на C нуль-указатель представляется константой NULL, которая определена в заголовочном файле stdio.h. Использование нулевого указателя может помочь избежать ошибок и добавить функциональность в программы на C.

В этом практическом занятии вы узнаете о нулевых указателях и о том, как их использовать в программировании на C. Вы создадите программу, которая использует нулевые указатели для поиска имен в массиве.

Примечание: вам нужно самостоятельно создать файл ~/project/main.c, чтобы практиковаться в написании кода и узнать, как компилировать и запускать его с использованием gcc.

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 перед звездочкой (*).

Указатель void должен быть приведен (cast) к другому типу данных, прежде чем его можно будет разыменовать или использовать для арифметики указателей.

#include <stdio.h>

int main() {
   int n = 10;
   void *ptr = &n; // ptr — это указатель void, указывающий на int
   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;  // имя не найдено
}

Настроить программу для ввода пользователем

Вы можете настроить программу для того, чтобы пользователь мог вводить имена для массива и искать имена. Это можно сделать с использованием функции scanf() в программировании на C.

#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 для завершения):\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 для завершения):\n");
        scanf("%s", name);

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

        int index = search(names, name);

        if(index!= -1)
        {
            printf("%s найдено в индексе %d.\n", name, index);
        }
        else
        {
            printf("%s не найдено.\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. Вы увидели, как объявить нулевой указатель и указатель void, а также как использовать нулевой указатель для отметки конца массива указателей. Вы также узнали, как настроить программу для ввода пользователем и поиска имен с использованием нулевых указателей. Используя нулевые указатели в своих программах, вы можете сделать их более надежными и избежать распространенных ошибок.