Inicialización sencilla de arrays de punteros en C: Consejos y mejores prácticas
Un puntero es una variable que almacena la dirección de otra variable. El nombre de la variable puntero debe prefijarse con el símbolo "*". Al igual que en el caso de una variable normal, también podemos declarar un "array de punteros", donde cada subíndice del array contiene la dirección de un tipo de array.
¿Cómo inicializar un array de punteros en C?
Una variable puntero puede inicializarse en el momento de la declaración, asignándole la dirección de una variable existente. El siguiente fragmento muestra cómo puedes inicializar un puntero:
int x = 10;
int *y = &x;
Por defecto, todas las variables, incluidas las variables puntero, pertenecen a la "clase de almacenamiento auto". Esto significa que una variable puntero almacenará una dirección de memoria impredecible, basura, aleatoria, lo que puede llevar a comportamiento indefinido y riesgos potenciales para un programa, como errores de fallo de segmentación. Por tanto, debería inicializarse a NULL si no tenemos un valor específico que almacenar en el momento de la declaración.
int *ptr = NULL;
Un "array de punteros" almacena la dirección en cada elemento. El tipo del array debe coincidir con el tipo de la variable objetivo.
Inicializar array de punteros usando la palabra clave static
También puedes usar la palabra clave static para inicializar un array de punteros que almacene "0" en cada subíndice.
Ejemplo
#include <stdio.h>
int main(){
static int *ptr[5];
for (int i = 0; i < 5; i++){
printf("ptr[%d] = %d\n", i, ptr[i]);
}
return 0;
}
Salida
ptr[0]= 0
ptr[1]= 0
ptr[2]= 0
ptr[3]= 0
ptr[4]= 0
Inicializar array de punteros a enteros
Aquí declaramos un array de punteros a enteros y almacenamos las direcciones de tres variables enteras.
Ejemplo
#include <stdio.h>
int main(){
int a = 10, b = 20, c = 30;
int *ptr[3] = {&a, &b, &c};
for (int i = 0; i < 3; i++){
printf("ptr[%d]: dirección: %d valor: %d\n", i, ptr[i], *ptr[i]);
}
return 0;
}
Salida
ptr[0]: dirección: 6422040 valor: 10
ptr[1]: dirección: 6422036 valor: 20
ptr[2]: dirección: 6422032 valor: 30
Inicializar array de punteros por direcciones directas
Podemos almacenar la dirección de cada elemento de un array normal en el elemento correspondiente de un array de punteros.
Ejemplo
#include <stdio.h>
int main(){
int arr[] = {10, 20, 30};
int *ptr[3] = {&arr[0], &arr[1], &arr[2]};
for (int i = 0; i < 3; i++){
printf("ptr[%d]: dirección: %d valor: %d\n", i, ptr[i], *ptr[i]);
}
return 0;
}
Salida
ptr[0]: dirección: 6422032 valor: 10
ptr[1]: dirección: 6422036 valor: 20
ptr[2]: dirección: 6422040 valor: 30
Recorrer un array con su dirección base
Cuando obtenemos la dirección base de un array (en este caso "&arr[0]"), podemos obtener las direcciones de sus elementos subsiguientes, sabiendo que el puntero se incrementa por el tamaño del tipo de dato.
Por tanto, solo con la dirección base (el nombre del array es lo mismo que la dirección del elemento 0), podemos recorrer un array.
Ejemplo 1
#include <stdio.h>
int main(){
int arr[] = {10, 20, 30};
int *ptr = arr;
for (int i = 0; i < 3; i++){
printf("ptr[%d]: dirección: %d valor: %d\n", i, ptr+i, *(ptr+i));
}
return 0;
}
Salida
ptr[0]: dirección: 6422020 valor: 10
ptr[1]: dirección: 6422024 valor: 20
ptr[2]: dirección: 6422028 valor: 30
Ejemplo 2: Recorrer un array 2D usando un array de punteros
En este ejemplo, tenemos un array 2D. La dirección del elemento 0 de cada fila se almacena en un array de punteros. Al recorrer, la dirección almacenada en cada elemento del array de punteros, que apunta al elemento 0 de la fila correspondiente, se incrementa para obtener los valores en cada fila.
#include <stdio.h>
int main(){
// array 2d
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
};
int ROWS = 2, COLS = 4;
int i, j;
// puntero
int (*ptr)[4] = arr;
// imprimir los elementos del array via puntero ptr
for (i = 0; i < ROWS; i++) {
for (j = 0; j < COLS; j++) {
printf("%d ", *(ptr[i]+j));
}
printf("\n");
}
return 0;
}
Salida
1 2 3 4
5 6 7 8
Ejemplo 3
Realmente no necesitamos un array de punteros aquí, ya que podemos usar el nombre de este array 2D como su puntero base, e incrementarlo por filas y columnas para obtener los elementos en el array 2D dado:
#include <stdio.h>
int main(){
// array 2d
int arr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
};
int ROWS = 2, COLS = 4;
int i, j;
// puntero
int *ptr = arr;
// imprimir los elementos del array via puntero ptr
for (i = 0; i < ROWS; i++){
for (j = 0; j < COLS; j++){
printf("%d ", *(ptr + i * COLS + j));
}
printf("\n");
}
return 0;
}
Salida
1 2 3 4
5 6 7 8
Inicializar array de punteros a caracteres (strings)
En programación C, un string es un array de tipo de dato char. Dado que el nombre de un array también representa la dirección de su elemento 0, un string puede declararse como:
char arr[] = "Hola";
Usando notación de puntero, un string se asigna a un puntero char como:
char *arr = "Hola";
Podemos entonces declarar un array de punteros char para almacenar múltiples strings de la siguiente manera:
char *arr[3] = {"string1", "string2", "string3", ... };
Ejemplo
El siguiente ejemplo tiene un array de punteros char que se usa para almacenar nombres de lenguajes de computadora:
#include <stdio.h>
int main(){
char *langs[10] = {
"PYTHON", "JAVASCRIPT", "PHP", "NODE JS", "HTML",
"KOTLIN", "C++", "REACT JS", "RUST", "VBSCRIPT"
};
for(int i = 0; i < 10; i++)
printf("%s\n", langs[i]);
return 0;
}
Salida
PYTHON
JAVASCRIPT
PHP
NODE JS
HTML
KOTLIN
C++
REACT JS
RUST
VBSCRIPT
En este programa, "langs" es un puntero a un array de 10 strings. Por tanto, si "langs[0]" apunta a la dirección 5000, entonces "langs + 1" apuntará a la dirección 5004 que almacena el puntero al segundo string.
Por tanto, también podemos usar la siguiente variación del bucle para imprimir el array de strings:
for (int i = 0; i < 10; i++){
printf("%s\n", *(langs + i));
}
Inicialización de array dinámico de punteros
Puedes usar la función malloc() para declarar e inicializar un array de punteros de forma dinámica.
Ejemplo
#include <stdio.h>
#include <stdlib.h>
int main(){
int *arr = (int *)malloc(sizeof(int) * 5);
for(int i = 0; i < 5; i++){
arr[i] = i;
}
for (int x = 0; x < 5; x++){
printf("%d %d\n", x, arr[x]);
}
return 0;
}
Salida
0 0
1 1
2 2
3 3
4 4
Incluso puedes pedir entrada del usuario y asignar los valores a los elementos en el array de punteros:
for(i = 0; i < 5; i++){
scanf("%d", &x);
arr[i] = x;
}
Lenguaje C
- Dominando las Interfaces en C#: Definición, Implementación y Casos de Uso Prácticos
- 30 preguntas esenciales de entrevista Objective-C y respuestas (Guía 2026)
- Toma de decisiones en C#: Estructuras condicionales esenciales
- Guía Completa de Operadores en C++: Tipos, Uso y Mejores Prácticas
- Programación en C: Dominando la Conversión y Casting de Tipos
- Dominando funciones definidas por el usuario en C: guía paso a paso
- Dominando la sentencia switch en C#: Sintaxis, ejemplos y mejores prácticas
- Operador ternario en C#: Guía concisa para expresiones condicionales
- Dominando Stack en C#: Push, Pop y Ejemplos Prácticos
- Dominando funciones en C: Ejemplos prácticos de recursión y técnicas inline
- Interfaces en C#: Contratos de diseño para POO robusta