Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Industrial programming >> Lenguaje C

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

  1. Dominando las Interfaces en C#: Definición, Implementación y Casos de Uso Prácticos
  2. 30 preguntas esenciales de entrevista Objective-C y respuestas (Guía 2026)
  3. Toma de decisiones en C#: Estructuras condicionales esenciales
  4. Guía Completa de Operadores en C++: Tipos, Uso y Mejores Prácticas
  5. Programación en C: Dominando la Conversión y Casting de Tipos
  6. Dominando funciones definidas por el usuario en C: guía paso a paso
  7. Dominando la sentencia switch en C#: Sintaxis, ejemplos y mejores prácticas
  8. Operador ternario en C#: Guía concisa para expresiones condicionales
  9. Dominando Stack en C#: Push, Pop y Ejemplos Prácticos
  10. Dominando funciones en C: Ejemplos prácticos de recursión y técnicas inline
  11. Interfaces en C#: Contratos de diseño para POO robusta