Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Entender los apuntadores

Estas en el tema de Entender los apuntadores en el foro de C/C++ en Foros del Web. Hola, he realizado este programa: Código: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main(void) 5 { 6 int a = 3; 7 int ...
  #1 (permalink)  
Antiguo 11/12/2010, 13:16
 
Fecha de Ingreso: octubre-2006
Mensajes: 169
Antigüedad: 18 años
Puntos: 2
Entender los apuntadores

Hola,

he realizado este programa:

Código:
 1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 int main(void)
  5 {
  6         int a = 3;
  7         int b = 1;
  8         printf("El valor de a es %d\n", a);
  9         int *p = &a;
 10         printf("El valor de *p es %d\n", *p);
 11         int *q = p;
 12         printf("El nuevo valor de *q es %d\n", *q);
 13         *q = b;
 14         printf("El valor de *q es ahora %d\n", *q);
 15         return 0;
 16 }
y lo que imprime es esto

Código:
El valor de a es 3
El valor de *p es 3
El nuevo valor de *q es 3
El valor de *q es ahora 1
Intentando descifrar las líneas:
la número 9 es que el apuntador *p accede a la dirección & de memoria de a y a su valor.
No entiendo el motivo por el cual ya no podemos poner & delante de p y b en las líneas 11 y 13. Entiendo que deberíamos colocar & delante de objetos que están en memoria y b lo está. Si se hace de otra manera da problemas de compilación.

¿me podéis ayudar a entenderlo?

Gracias.
  #2 (permalink)  
Antiguo 11/12/2010, 13:45
 
Fecha de Ingreso: marzo-2009
Mensajes: 74
Antigüedad: 15 años, 7 meses
Puntos: 1
Respuesta: Entender los apuntadores

El Operador de Dirección ( &) regresa la dirección de una variable. Este operador está asociado con la variable a su derecha: &a; Esta línea regresa la dirección de la variable a.

El Operador de Indirección ( * ) trabaja a la inversa del operador de Dirección. También esta asociado con la variable a su derecha, toma la dirección y regresa el dato que contiene esa dirección. Por ejemplo


Código C++:
Ver original
  1. int *q = p;
  2. printf("El nuevo valor de *q es %d\n", *q);
  3.  *q = b;
  #3 (permalink)  
Antiguo 11/12/2010, 14:08
Avatar de Munire  
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 14 años, 4 meses
Puntos: 4
Respuesta: Entender los apuntadores

Cita:
Intentando descifrar las líneas:
la número 9 es que el apuntador *p accede a la dirección & de memoria de a y a su valor.
no es que *p acceda a la memoria de "a", es que en la memoria de "p" se guarda la direccion de memoria de "a" y en la direccion de memoria de "a" se guarda un numero (en este caso el 3). por eso se dice que "p" apunta a "a".

int *p=&a;

int *p es declarar un puntero llamado "p". & es la direccion de memoria. por lo que si pones &a esta devolviendo la direccion de memoria de "a" (es decir donde esta alojada "a". por ejemplo la direccion 2000h).


Cita:
No entiendo el motivo por el cual ya no podemos poner & delante de p y b en las líneas 11 y 13. Entiendo que deberíamos colocar & delante de objetos que están en memoria y b lo está. Si se hace de otra manera da problemas de compilación.
cuando tu declaras un puntero:

int *p = _ aqui tiene que ir una direccion de memoria que la puedes poner de dos maneras:

&a o q (otro puntero), como "q" ya es una direccion de memoria no hace falta poner &.

en la linea 13 es diferente:

*q = b;

en este caso no esta haciendo que "q" apunte a "b". lo que esta haciendo es escribir el valor de b (un numero) en la direccion de memoria donde apunta "q". si por ejemplo "q" apunta a "a" , "a" va a valer lo que vale "b" (un numero).

esto es lioso por que se confunde con esto:

int *q = &b => declara puntero "q" que apunta a "b"

*q=b => escribe el valor de b donde apunta "q"


int *q = &b; esto es igual a esto:

int *q;
q = &b;


cuando hay un int (para declarar) el asterisco solo indica que es un puntero (para diferenciarlo de las declaraciones de una variable normal)

pero cuando NO hay un int el asterisco indica que te refieres a donde apunta el puntero (si apunta a "b" pues a "b")






#include <stdio.h>
#include <stdlib.h>

int main(void)

{
int a = 3;

int b = 1;

printf("El valor de a es %d\n", a);

int *p = &a; crea un puntero "p" que apunta a "a"

printf("El valor de *p es %d\n", *p); *p es el valor que hay en la zona de memoria donde apunta "p" (es decir imprime el valor de "a")

int *q = p; crea un puntero "q" que apunta al mismo sitio que "p" (en este caso a "a")

printf("El nuevo valor de *q es %d\n", *q); *q es el valor que hay en la zona de memoria donde apunta "p" (es decir imprime el valor de "a")

*q = b; escribe el valor de "b" que es 1 en la zona de memoria donde apunta "q", como "q" apunta a "a", escribe 1 en "a". es decir "a" pasa a ser 1

printf("El valor de *q es ahora %d\n", *q); con lo cual si imprimes *q imprimira el valor de "a" que ahora es el mismo que "b" (1)


return 0;

}
  #4 (permalink)  
Antiguo 11/12/2010, 14:11
 
Fecha de Ingreso: octubre-2006
Mensajes: 169
Antigüedad: 18 años
Puntos: 2
Respuesta: Entender los apuntadores

Gracias por las respuestas.

Han sido muy esclarecedoras sobretodo el caso de *q=p y *q=b que no acababa de "ver".

Un saludo.

Última edición por luface2000; 11/12/2010 a las 14:20

Etiquetas: apuntadores, entender
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:02.