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



