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
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
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
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
¿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
¡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
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
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
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
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.