MEJOR SITIO PARA DESARROLLADORES WEB
C Idioma. W3Schools en español. Lecciones para principiantes

Ua En De

C Punteros y matrices


Punteros y matrices

También puede utilizar punteros para acceder a matrices.

Considere la siguiente matriz de números enteros:

Ejemplo

int myNumbers[4] = {25, 50, 75, 100};

En el capítulo matrices aprendiste que puedes recorrer los elementos de la matriz con un bucle for:

Ejemplo

int myNumbers[4] = {25, 50, 75, 100};
int i;

for (i = 0; i < 4; i++) {
  printf("%d\n", myNumbers[i]);
}

Resultado:

25
50
75
100
Inténtalo tú mismo »

En lugar de imprimir el valor de cada elemento de la matriz, imprimamos la dirección de memoria de cada elemento de la matriz:

Ejemplo

int myNumbers[4] = {25, 50, 75, 100};
int i;

for (i = 0; i < 4; i++) {
  printf("%p\n", &myNumbers[i]);
}

Resultado:

0x7ffe70f9d8f0
0x7ffe70f9d8f4
0x7ffe70f9d8f8
0x7ffe70f9d8fc
Inténtalo tú mismo »

Tenga en cuenta que el último número de cada una de las direcciones de memoria de los elementos es diferente, con una suma de 4.

Esto se debe a que el tamaño de un tipo int suele ser de 4 bytes, recuerda:

Ejemplo

// Crear una variable int
int myInt;

// Obtener el tamaño de la memoria de un int
printf("%lu", sizeof(myInt));

Resultado:

4
Inténtalo tú mismo »

Entonces, en el "ejemplo de dirección de memoria" anterior, puede ver que el compilador reserva 4 bytes de memoria para cada elemento de la matriz, lo que significa que toda la matriz ocupa 16 bytes (4 * 4) de almacenamiento de memoria:

Ejemplo

int myNumbers[4] = {25, 50, 75, 100};

// Obtener el tamaño de la matriz myNumbers
printf("%lu", sizeof(myNumbers));

Resultado:

16
Inténtalo tú mismo »

¿Cómo se relacionan los punteros con las matrices?

Bien, entonces, ¿cuál es la relación entre punteros y matrices? Bueno, en C, el nombre de una matriz es en realidad un puntero al primer elemento de la matriz.

¿Confundido? Intentemos comprender esto mejor y utilicemos nuevamente nuestro "ejemplo de dirección de memoria" anterior.

La dirección de memoria del primer elemento es la misma que el nombre de la matriz:

Ejemplo

int myNumbers[4] = {25, 50, 75, 100};

// Obtenga la dirección de memoria de la matriz myNumbers
printf("%p\n", myNumbers);

// Obtenga la dirección de memoria del primer elemento de la matriz
printf("%p\n", &myNumbers[0]);

Resultado:

0x7ffe70f9d8f0
0x7ffe70f9d8f0
Inténtalo tú mismo »

¡Esto básicamente significa que podemos trabajar con matrices mediante punteros!

¿Cómo? Dado que myNumbers es un puntero al primer elemento de myNumbers, puede utilizar el operador * para acceder a él:

Ejemplo

int myNumbers[4] = {25, 50, 75, 100};

// Obtener el valor del primer elemento en myNumbers
printf("%d", *myNumbers);

Resultado:

25
Inténtalo tú mismo »

Para acceder al resto de elementos en myNumbers, puede incrementar el puntero/matriz (+1, +2, etc.):

Ejemplo

int myNumbers[4] = {25, 50, 75, 100};

// Obtener el valor del segundo elemento en myNumbers
printf("%d\n", *(myNumbers + 1));

// Obtener el valor del tercer elemento en myNumbers
printf("%d", *(myNumbers + 2));

// etcétera

Resultado:

50
75
Inténtalo tú mismo »

O recorrerlo en bucle:

Ejemplo

int myNumbers[4] = {25, 50, 75, 100};
int *ptr = myNumbers;
int i;

for (i = 0; i < 4; i++) {
  printf("%d\n", *(ptr + i));
}

Resultado:

25
50
75
100
Inténtalo tú mismo »

También es posible cambiar el valor de los elementos de la matriz con punteros:

Ejemplo

int myNumbers[4] = {25, 50, 75, 100};

// Cambia el valor del primer elemento a 13
*myNumbers = 13;

// Cambia el valor del segundo elemento a 17
*(myNumbers +1) = 17;

// Obtener el valor del primer elemento
printf("%d\n", *myNumbers);

// Obtener el valor del segundo elemento
printf("%d\n", *(myNumbers + 1));

Resultado:

13
17
Inténtalo tú mismo »

Esta forma de trabajar con matrices puede parecer un poco excesiva. Especialmente con matrices simples como en los ejemplos anteriores. Sin embargo, para matrices grandes, puede ser mucho más eficiente acceder y manipular matrices con punteros.

También se considera más rápido y sencillo acceder a matrices bidimensionales con punteros.

Y dado que las cadenas son en realidad matrices, también puedes usar punteros para acceder a cadenas.

Por ahora, es fantástico que sepas cómo funciona esto. Pero como especificamos en el capítulo anterior; Los punteros deben manejarse con cuidado, ya que es posible sobrescribir otros datos almacenados en la memoria.