¿Cuál es la diferencia entre «array» y «&array» para «int array[5]»?

Si alguien ha definido una array como » int array [5] «, ¿cuál es el significado de » array » o » & array «? ¿Son los dos iguales o son diferentes? Puede sentirse tentado a pensar que ambos apuntarían al primer elemento de la array, es decir, ambos tendrán la misma dirección. ¡Averigüémoslo!

Para comprobar esto, lo primero que viene a la mente es el siguiente programa.

C++

// C++ Program to check whether 'array' and '&array'
// prints the same address
 
#include <iostream>
 
int main()
{
   int array[5];
   
   std::cout << "array = " << array << " : &array = " << &array;
 
   return 0;
}
 
// This code is contributed by sarajadhav12052009

C

#include <stdio.h>
int main()
{
   int array[5];
 
   /* If %p is new to you, you can use %d as well */
   printf("array = %p : &array = %p\n", array, &array);
 
   return 0;
}
Producción

array = 0x7fffce606b90 : &array = 0x7fffce606b90

Así que tienes la misma dirección tanto para » array » como para » &array «. De nuevo, estás tentado a pensar que ambos son iguales. Bueno, ¡no lo son! ¿Cómo es que una variable y su & (es decir, la dirección de) son iguales? No parece lógico, pero vimos que tanto » array » como » &array » están imprimiendo la misma dirección. Puede ser que sea demasiado pronto para concluir. El quid de esta publicación es que, aunque ambos dan como resultado la misma dirección, son diferentes tipos de direcciones . Y esta es la diferencia entre “ array ” y “ &array ”.

Y solo para mostrar esta diferencia, sugeriría echar un vistazo al siguiente programa.

C++

// C++ Program to check that adding 1 to both 'array' and '&array'
// prints the same address or not
 
#include <iostream>
using namespace std;
 
int main()
{
   int array[5];
  
   cout << "array = " << array << " : &array = " << &array << endl;
 
   cout << "array + 1 = " << array + 1 << " : &array + 1 = " << &array + 1;
   
   return 0;
}
 
// This code is contributed by sarajadhav12052009

C

#include <stdio.h>
 
int main()
{
   int array[5];
 
   /* If %p is new to you, you can use %d as well */
   printf("array = %p : &array = %p\n", array, &array);
 
   printf("array + 1 = %p : &array + 1 = %p", array + 1, &array + 1);
 
   return 0;
}
Producción

array = 0x7ffc6ab5daa0 : &array = 0x7ffc6ab5daa0
array + 1 = 0x7ffc6ab5daa4 : &array + 1 = 0x7ffc6ab5dab4

Con la aritmética de punteros, sabemos lo que sucede cuando sumamos un número entero a un puntero. Entonces, ¿puedes adivinar el resultado del programa anterior sin ejecutarlo? ¿No deberían “ array+1 ” y “ &array+1 ” apuntar a la misma dirección? Bueno, puede que te sorprendas 🙂

Básicamente, » array » es un » puntero al primer elemento de la array » pero » &array » es un » puntero a toda la array de 5 int «. Dado que » array » apunta a int , la adición de 1 dio como resultado una dirección con un incremento de 4 (suponiendo que el tamaño de int en su máquina es de 4 bytes). Dado que “ &array ” es un puntero a una array de 5 enteros, la suma de 1 dio como resultado una dirección con un incremento de 4 x 5 = 20 = 0x14. Ahora ve por qué estos dos punteros aparentemente similares son diferentes a nivel central. Esta lógica también se puede extender a arreglos multidimensionales. Supongamos doble dosDarray[5][4]es una array 2D. Aquí, «twoDarray» es un puntero a una array de 4 int pero «&twoDarray» es un puntero a una array de 5 filas de 4 int». Si esto suena críptico, siempre puede tener un pequeño programa para imprimirlos después de agregar 1. Esperamos poder aclarar que cualquier nombre de array en sí mismo es un puntero al primer elemento,  pero & (es decir, la dirección de) para el nombre de la array es un puntero a toda la array en sí.

Haga clic en Me gusta/Tweet/G+1 si encuentra útil lo anterior. Además, déjenos un comentario para obtener más aclaraciones o información. Nos encantaría ayudar y aprender 🙂

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *