Nombres de Arrays como Punteros
Parte de la sección Logic & Flow del Journey de C de Coddy — lección 7 de 63.
Los arreglos y punteros en C tienen una relación especial que es fundamental para entender cómo C trabaja con los datos en la memoria. Cuando declaras un arreglo, el nombre del arreglo en sí actúa como un puntero constante al primer elemento del arreglo.
Esto significa que cuando tienes un array como int numbers[5];, el nombre numbers es esencialmente un puntero que siempre apunta a numbers[0]. Puedes pensar en el nombre del array como un puntero incorporado que no necesitas declarar por separado.
int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' apunta al primer elemento
// numbers == &numbers[0] // ¡Estos son equivalentes!Esta equivalencia es crucial: numbers y &numbers[0] ambos te dan exactamente la misma dirección de memoria. El nombre del array es simplemente una forma más conveniente de referirse a la dirección del primer elemento sin tener que usar el operador de dirección.
Comprender esta relación abre la puerta al uso de técnicas de punteros con arreglos, lo que puede hacer que su código sea más flexible y eficiente. La diferencia clave es que, a diferencia de los punteros regulares, los nombres de los arreglos son punteros constantes: no se puede cambiar a qué apuntan.
Desafío
FácilEscribe un programa en C que demuestre la equivalencia entre los nombres de los arreglos y los punteros a sus primeros elementos. Tu programa debe:
- Declara un arreglo de enteros llamado
numberscon 4 elementos e inicialízalo con los valores {10, 20, 30, 40} - Declara un puntero a un entero llamado
ptr - Asigna el nombre del arreglo
numbersal punteroptr - Imprime la dirección almacenada en
numbersusandoprintfcon el especificador de formato%p - Imprime la dirección del primer elemento
&numbers[0]usandoprintfcon el especificador de formato%p - Imprime la dirección almacenada en
ptrusandoprintfcon el especificador de formato%p - Imprime el valor del primer elemento usando el nombre del arreglo:
*numbers - Imprime el valor del primer elemento usando el puntero:
*ptr
Tu salida debe mostrar los resultados en el siguiente formato:
Array name address: [address]
First element address: [address]
Pointer address: [address]
Value via array name: 10
Value via pointer: 10Este desafío demuestra que el nombre del arreglo actúa como un puntero constante al primer elemento, y que numbers, &numbers[0] y ptr contienen todos la misma dirección de memoria cuando a ptr se le asigna el nombre del arreglo.
Hoja de referencia
Los nombres de los arreglos en C actúan como punteros constantes al primer elemento del arreglo.
Cuando declaras un arreglo, el nombre del arreglo apunta al primer elemento:
int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' apunta al primer elemento
// numbers == &numbers[0] // ¡Estos son equivalentes!Puedes asignar el nombre de un arreglo a un puntero:
int *ptr;
ptr = numbers; // ptr ahora apunta al primer elementoAccede a los valores usando la notación de punteros:
*numbers // Valor del primer elemento a través del nombre del arreglo
*ptr // Valor del primer elemento a través del punteroDiferencia clave: Los nombres de los arreglos son punteros constantes; no puedes cambiar a qué apuntan, a diferencia de los punteros regulares.
Pruébalo tú mismo
#include <stdio.h>
int main() {
// TODO: Escribe tu código aquí
// 1. Declara e inicializa el arreglo 'numbers' con {10, 20, 30, 40}
// 2. Declara un puntero a entero llamado 'ptr'
// 3. Asigna el nombre del arreglo al puntero
// 4. Imprime todas las direcciones y valores requeridos
return 0;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Fundamentos de Punteros
¿Qué es un puntero?Declaración de punterosEl operador de dirección (&)El operador de desreferencia (*)Punteros NULLResumen: Conceptos básicos de punteros4Proyecto: Utilidad de texto simple
Descripción general del proyectoContar caracteres2Punteros y Arrays
Nombres de Arrays como PunterosElementos de un Array - PunterosAritmética de PunterosComparación de PunterosResumen: Recorrido de Arrays con Punteros5Punteros y funciones
Paso por valorPasar punteros a funcionesModificar variables mediante punterosUn ejemplo clásico: Intercambio (Swap)Pasar arrays a funcionesResumen: Argumentos de punteros a funciones3Arreglos de caracteres y cadenas
Cadenas como arreglos de charEl terminador nuloEntrada de cadenas con scanfUso de strlen()Uso de strcpy()Uso de strcat()Uso de strcmp()Resumen: Funciones básicas de cadenas