Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mort en 18 Abril 2016, 00:15 am



Título: ¿Direccion del apuntador de un arreglo?
Publicado por: mort en 18 Abril 2016, 00:15 am
Bien espero darme a entender, Tengo una incomodidad respecto al uso  de apuntadores(o quizá varias), y pues siempre que creo que ya por fin he entendido algo, tengo que reescribir mi interpretación de eso porque se me siguen  presentando nuevas.

Mi duda es respecto a la relación apuntador-arreglo, pero pondré primero mi interpretación de como creo que se trabajan los punteros, por si estoy equivocado en algo me puedan corregir y no tener que abrir de nuevo otro tema.

Como yo lo veo con un apuntador se puede referenciar a 3 datos distintos.
es decir:

Código:
char *x = "hola";
   char *s1;
   s1 = &x[2];
   printf("%p\n", &s1); ///puedo hacer referencia a la dirección del apuntador
   printf("%p\n", s1); ///a la dirección a la que apunta s1(es decir su valor)
   printf("%s\n", s1);///y al dato que guarda la dirección a la que apunta s1.


Nose si mi idea este bien en un principio..

función que recibe la dirección de un arreglo:

Código:
void funcion(char *s1) ///recibe como parametro el valor del puntero(es decir una direccion)
{                      ///que en este caso es la del principio de la cadena
char *Apu = s1; //Apu se le asigna el valor de s1(la direccion de la cadena)
char **todos;
todos = &s1; ///se le asigna la direccion de s1(no el valor)
printf("%p\n", &s1); ///imprime la direccion de s1
printf("%p\n", Apu);///imprime el valor de s1(la direccion de la cadena)
printf("%p\n", todos);///imprime el valor del apuntador, en este caso la direccion de s1.
printf("%s\n", *todos);///imprime la indireccion de &s1, en este caso seria el valor(la cadena).
}

Igual si estoy mal en algo les agradeceria que me lo hagan saber...

Ahora si, de lo que va el tema como dije al principio por lo que entiendo, la dirección del apuntador y el valor del apuntador son direcciones distintas,  entonces como hago la diferencia por ejemplo en un arreglo de caracteres, si...

Código:
 char cadena[5] = "hol";
 
   printf("%p\n", cadena);  //valor del apuntador, en este caso(la dirección del primer elemento del arreglo)
   printf("%p\n", &(*(cadena+1))); ///la dirección del segundo elemento del arreglo
   printf("%p\n", &(*(cadena+2)));///la dirección del tercer elemento del arreglo

¿Cual es la dirección donde se almacena el apuntador que tiene como valor la dirección del primer elemento del arreglo?

Código:
printf("%p\n", &cadena);  //tratando de obtener la dirección del apuntador

Si lo hago de esta forma me tira la misma dirección que la del primer elemento del arreglo, es decir, la dirección del apuntador y la dirección del valor del apuntador son la misma, y esto me causa conflicto en comprensión.

Espero haberme explicado y puedan ilustrarme con esto...
De antemano gracias. :)


Título: Re: ¿Direccion del apuntador de un arreglo?
Publicado por: HardForo en 18 Abril 2016, 00:30 am
La direccion  que ves como del puntero es la direccion como dices del primer elemento del array.

El puntero podria estar en si en la pila, o en otro lado pero tu ves la dirección a donde apunta el contenido.   Supongo la dirección real del puntero no es algo que le concierna al programador y por eso no se provee.



PD: habia hecho una edición pero veo se perdió y vuelvo a hacerla.


Título: Re: ¿Direccion del apuntador de un arreglo?
Publicado por: MAFUS en 18 Abril 2016, 12:53 pm
cadena es un objeto que devuelve la dirección de inicio del array al que representa, es recir, tanto si se lo das a printf con %p, que imprime direcciones de memoria, te tiene que dar lo mismo ya que cadena y &cadena son equivalentes:  los dos devuelven la dirección del primer elemento del array.