Usando un puntero nulo en el programa C

CBeginner
Practicar Ahora

Introducción

Un puntero nulo es un puntero que no apunta a ninguna dirección de memoria. En el programa C, un puntero nulo se representa por la constante NULL, que está definida en el archivo de encabezado stdio.h. El uso de un puntero nulo puede ayudar a evitar errores y agregar funcionalidad a los programas C.

En este laboratorio, aprenderá sobre los punteros nulos y cómo utilizarlos en el programa C. Creará un programa que utilice punteros nulos para buscar nombres en una matriz.

Nota: Debe crear el archivo ~/project/main.c usted mismo para practicar la codificación y aprender cómo compilar y ejecutarlo utilizando gcc.

cd ~/project
## crear main.c
touch main.c
## compilar main.c
gcc main.c -o main
## ejecutar main
./main

Declarar un puntero nulo

En el programa C, un puntero nulo es un puntero que no apunta a nada. Para declarar un puntero nulo, puede asignar el valor NULL a una variable puntero.

#include <stdio.h>

int main() {
   int *ptr = NULL;    // ptr es un puntero nulo
   return 0;
}

Declarar un puntero void

Un puntero void es un puntero que no tiene un tipo específico. Se puede utilizar para apuntar a cualquier tipo de dato. Para declarar un puntero void, se utiliza la palabra clave void antes del asterisco (*).

Un puntero void debe ser convertido (cast) a otro tipo de dato antes de que pueda ser desreferenciado o utilizado para aritmética de punteros.

#include <stdio.h>

int main() {
   int n = 10;
   void *ptr = &n; // ptr es un puntero void que apunta a un int
   printf("Value of n: %d\n", *(int*)ptr); // se convierte a puntero int antes de desreferenciar
   return 0;
}

Usar un puntero nulo para marcar el final de una matriz de punteros

Puede utilizar un puntero nulo para marcar el final de una matriz de punteros en el programa C. Esto puede ser útil al buscar nombres u otros datos en la matriz.

#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 está en la lista.\n");
    }

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

    return 0;
}

// definir la función de búsqueda
int search(char *ptr[], char*name)
{
    for(int i=0; ptr[i]; ++i)
    {
        if(!strcmp(ptr[i], name))
        {
            return i;
        }
    }

    return -1;  // nombre no encontrado
}

Personalizar el programa para la entrada del usuario

Puede personalizar el programa para permitir que el usuario ingrese nombres para la matriz y busque nombres. Esto se puede hacer utilizando la función scanf() en el programa 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("Ingrese nombres (presione enter para detener):\n");

    // obtener nombres a partir de la entrada del usuario
    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;    // marcar el final de la matriz con un puntero nulo

    // buscar nombres
    while(1)
    {
        printf("Ingrese el nombre a buscar (presione enter para detener):\n");
        scanf("%s", name);

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

        int index = search(names, name);

        if(index!= -1)
        {
            printf("%s se encuentra en el índice %d.\n", name, index);
        }
        else
        {
            printf("%s no encontrado.\n", name);
        }
    }

    return 0;
}

// definir la función de búsqueda
int search(char *ptr[], char*name)
{
    for(int i=0; ptr[i]; ++i)
    {
        if(!strcmp(ptr[i], name))
        {
            return i;
        }
    }

    return -1;  // nombre no encontrado
}

Resumen

En este laboratorio, aprendió sobre los punteros nulos y cómo utilizarlos en el programa C. Vio cómo declarar un puntero nulo y un puntero void, y cómo utilizar un puntero nulo para marcar el final de una matriz de punteros. También aprendió cómo personalizar un programa para permitir la entrada del usuario y buscar nombres utilizando punteros nulos. Al utilizar punteros nulos en sus programas, puede hacerlos más robustos y evitar errores comunes.