Usando Ponteiros Nulos em Programação C

CBeginner
Pratique Agora

Introdução

Um ponteiro nulo (null pointer) é um ponteiro que não aponta para nenhum endereço de memória. Na programação em C, um ponteiro nulo é representado pela constante NULL, que é definida no arquivo de cabeçalho stdio.h. Usar um ponteiro nulo pode ajudar a evitar erros e adicionar funcionalidade aos programas em C.

Neste laboratório, você aprenderá sobre ponteiros nulos e como usá-los na programação em C. Você criará um programa que usa ponteiros nulos para pesquisar nomes em um array.

Nota: Você precisa criar o arquivo ~/project/main.c por conta própria para praticar a codificação e aprender a compilar e executá-lo usando o gcc.

cd ~/project
## create main.c
touch main.c
## compile main.c
gcc main.c -o main
## run main
./main

Declarar um Ponteiro Nulo

Na programação em C, um ponteiro nulo (null pointer) é um ponteiro que não aponta para nada. Para declarar um ponteiro nulo, você pode atribuir o valor NULL a uma variável ponteiro.

#include <stdio.h>

int main() {
   int *ptr = NULL;    // ptr is a NULL pointer
   return 0;
}

Declarar um Ponteiro Void

Um ponteiro void é um ponteiro que não possui um tipo específico. Ele pode ser usado para apontar para qualquer tipo de dado. Para declarar um ponteiro void, use a palavra-chave void antes do asterisco (*).

Um ponteiro void deve ser convertido (cast) para outro tipo de dado antes que possa ser desreferenciado ou usado para aritmética de ponteiros.

#include <stdio.h>

int main() {
   int n = 10;
   void *ptr = &n; // ptr é um ponteiro void apontando para um int
   printf("Value of n: %d\n", *(int*)ptr); // converte para ponteiro int antes de desreferenciar
   return 0;
}

Usar Ponteiro Nulo para Marcar o Fim de um Array de Ponteiros

Você pode usar um ponteiro nulo (null pointer) para marcar o fim de um array de ponteiros na programação em C. Isso pode ser útil ao pesquisar nomes ou outros dados no array.

#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;
}

// define the search function
int search(char *ptr[], char*name)
{
    for(int i=0; ptr[i]; ++i)
    {
        if(!strcmp(ptr[i], name))
        {
            return i;
        }
    }

    return -1;  // name not found
}

Personalizar o Programa para Entrada do Usuário

Você pode personalizar o programa para permitir que o usuário insira nomes para o array e pesquise por nomes. Isso pode ser feito usando a função scanf() na programação em 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 names (press enter to stop):\n");

    // get names from user input
    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;    // mark end of array with null pointer

    // search for names
    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;
}

// define the search function
int search(char *ptr[], char*name)
{
    for(int i=0; ptr[i]; ++i)
    {
        if(!strcmp(ptr[i], name))
        {
            return i;
        }
    }

    return -1;  // name not found
}

Resumo

Neste laboratório, você aprendeu sobre ponteiros nulos (null pointers) e como usá-los na programação em C. Você viu como declarar um ponteiro nulo e um ponteiro void, e como usar um ponteiro nulo para marcar o fim de um array de ponteiros. Você também aprendeu como personalizar um programa para permitir a entrada do usuário e pesquisar nomes usando ponteiros nulos. Ao usar ponteiros nulos em seus programas, você pode torná-los mais robustos e evitar erros comuns.