Usando un puntero nulo en el programa C

CCBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

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

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL c(("C")) -.-> c/UserInteractionGroup(["User Interaction"]) 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/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{{"Usando un puntero nulo en el programa C"}} c/for_loop -.-> lab-123293{{"Usando un puntero nulo en el programa C"}} c/arrays -.-> lab-123293{{"Usando un puntero nulo en el programa C"}} c/strings -.-> lab-123293{{"Usando un puntero nulo en el programa C"}} c/pointers -.-> lab-123293{{"Usando un puntero nulo en el programa C"}} c/memory_address -.-> lab-123293{{"Usando un puntero nulo en el programa C"}} c/user_input -.-> lab-123293{{"Usando un puntero nulo en el programa C"}} end

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. Puede utilizarse para almacenar cualquier tipo de datos. Para declarar un puntero void, utilice la palabra clave void antes del asterisco (*).

#include <stdio.h>

int main() {
   void *ptr;    // ptr es un puntero void
   return 0;
}

Utilizar 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.