Primero, entendamos las arrays , es una colección de elementos almacenados en ubicaciones de memoria contiguas. La idea básica es almacenar varios elementos del mismo tipo juntos a los que se puede acceder por índice/clave (un número).
La memoria contigua del tamaño declarado se asigna en montón/pila y luego la dirección del elemento se calcula matemáticamente durante el tiempo de ejecución como:
dirección del elemento = (dirección base) + (índice del elemento * tamaño de un solo elemento)
dónde,
- Dirección base: Es la dirección del elemento en el índice 0 o la ubicación del primer elemento de la array en la memoria. El compilador conoce esta dirección como la ubicación de memoria de la array.
- Índice de elemento: es el número secuencial (índice/clave) asignado al elemento donde se asigna 0 al primer elemento de la array. También se puede definir como el número de elementos anteriores a ese elemento en particular en la array.
- Tamaño de un solo elemento: los elementos de la array deben ser del mismo tipo de datos u objeto. El tamaño de un solo elemento es el número de bytes requeridos en la memoria para almacenar un solo elemento de ese tipo.
Por ejemplo:
El tipo int requiere 4 bytes (32 bits) , el tipo
char requiere un tipo
largo de 1 byte (8 bits) , requiere 8 bytes (64 bits), etc.
Ejemplo de implementación anterior:
int arr[6] = {3, 4, 7, 9, 7, 1}
dirección de arr[0] ( dirección base ) = 0 x 61fe00
dirección de arr[3] ( dirección del elemento ) = (dirección base) + ( índice de elemento * tamaño de un solo elemento)
0 x 61fe00 + ( 3 * 4) = 0 x 61fe0c
Aquí, el tamaño de un solo elemento es de 4 bytes, ya que es una array de tipo int.long long arr[6]={100, 12, 123, 899,124, 849}
dirección de arr[0] ( dirección base ) = 0x61fdf0
dirección de arr[3] ( dirección del elemento ) = (dirección base) + (índice del elemento * tamaño de un solo elemento)
0x61fdf0 + ( 3 * 8) = 0x61fe08
Aquí, el tamaño de un solo elemento es de 8 bytes, ya que es una array de tipo largo.Nota: Aquí las direcciones están en formato hexadecimal.
Veamos su implementación a través de un programa para imprimir la dirección de los elementos del arreglo:
C++
// Program to show how indexing works #include <iostream> using namespace std; int main() { int arr[6] = {3,4,7,9,7,1}; cout << "Base address:- " << (&arr) << endl; cout << "Element address at index 3:- " << (&arr[3]) << endl; return 0; }
Base address:- 0x7ffc64918c30 Element address at index 3:- 0x7ffc64918c3c