En este artículo, se analizan a continuación dos formas únicas y diferentes de acceder a un elemento desde una array en lugar de la expresión arr[i] convencional .
- Usando puntero *(arr+1)
- Usando un poco de manipulación i[arr] para usar arrays y la razón detrás de eso.
Cuando se compila un programa en C++ , se genera simultáneamente una tabla de símbolos . Está formado para almacenar los valores correspondientes de la dirección de todas las variables utilizadas en el programa.
Consideremos un programa en C++ y veamos cuál será la tabla de símbolos para el programa correspondiente:
C++
// C++ program for the above concepts #include <iostream> using namespace std; // Driver Code int main() { // Assigning a value to a int a = 5; // Printing the value of a cout << "Value of a: " << a; // Printing the address of a cout << "\nAddress of a: " << &a; return 0; }
Value of a: 5 Address of a: 0x7ffe25768fa4
La tabla de símbolos para el programa anterior sería así:
Nombre de la variable |
Dirección |
Valor |
a |
0x7ffe58e7cc4 |
5 |
Entonces, desde la tabla de símbolos, se puede ver que a cada variable se le asigna una dirección. Por lo tanto, cuando se inicializa la array, también obtiene alguna dirección. En la tabla, una array se almacena en forma de puntero que apunta hacia el primer elemento.
Ejemplo:
int a[10]; gets stored like: *(a) - which points to the first element. *(a+1) - which points to second element. Similarly we can have the last element pointed by *(a+(n-1)) we have (n-1) as arrays in C++ have zero based indexing
Usando este concepto, analicemos el primer método para acceder a las arrays:
Usando el concepto de punteros
A continuación se muestra el programa C++ para implementar el concepto anterior:
C++
// C++ program to demonstrate the // above approach #include <iostream> using namespace std; // Driver Code int main() { int arr[10]; // Conventional method // for(int i = 0; i<10; i++) //{ // arr[i] = i+1; //} // Pointer Method for (int i = 0; i < 10; i++) { *(arr + i) = i + 1; } cout << "Values : "; for (int i = 0; i < 10; i++) { cout << *(arr + i) << ' '; } return 0; }
Values : 1 2 3 4 5 6 7 8 9 10
Como se observa, una array se puede usar como *(arr) . Por lo tanto, se puede decir que:
Como se sabe,
*(p + 1) es exactamente lo mismo que *(1 + p).
Por lo tanto, *(arr + i) en el código anterior también se puede escribir como *(i + arr)
y básicamente *(arr + i) significa a[i] lo que implica que
*(i + arr) también se puede escribir como i[a]
A continuación se muestra el programa C++ para implementar el concepto anterior:
C++
// C++ program to demonstrate the // above approach #include <iostream> using namespace std; // Driver Code int main() { int arr[10]; // Conventional method // for(int i = 0; i<10; i++) //{ // arr[i] = i+1; //} // Method 2 for (int i = 0; i < 10; i++) { i[arr] = i + 1; } cout << "Values: "; for (int i = 0; i < 10; i++) { cout << i[arr] << ' '; } return 0; }
Values: 1 2 3 4 5 6 7 8 9 10