Punteros

Estado
Cerrado para nuevas respuestas.

Mafia

Juree!
Hola gente de gs. Mirando video-tutoriales y manuales llege a tocar el tema de los punteros. Pero no lo explican concretamente para que los entiendan bien..Alguien me puede los puede explicar?? Gracias
 

0xDEADBEEF

Vicinity of obscenity
Ex-Staff
Un puntero es un ID a un trozo de memoria. Trabajar en memoria es lo más complicado (al principio, si no se sabe lo que se hace), yo creo que lo mejor no es que alguien te lo explique, sino que busques ejemplos por internet e intentes aprenderlo.

Lo mejor es practica, rompe la memoria trescientas veces, y a la siguiente, aprenderás a no romper nada (;
 

Shab

Aprendiz Lvl 2
te lo explico bien simple :)

un puntero se declara de la siguiente manera

tipo *puntero;


un puntero es una variable que almacena la direccion de memoria de otra variable que contiene el dato que vos queres usar.
en la declaracion que te puse arriba tipo es el tipo del objeto apuntado que puede ser un tipo primitivo (int, char, float, etc) o derivado (structs, uniones, etc, etc)

Te doy un ejemplo:

C++:
int a = 234;
 
printf("%d/n",a); // imprime 234
 
int *p = NULL; //declaro un puntero que apunta a variables de tipo int y le asignamos el valor NULL para que no contenga basura por asi decirlo.
 
p = &a; // asignamos como valor de p la direccion de memoria de a
 
*p = 25; // *p hace referencia al valor que se guarda en la direccion de memoria a la que apunta el puntero, por lo tanto, estamos modificando a indirectamente
 
printf("%d /n",a); // imprime 25

si no quedo claro volve a preguntar, es normal, a mi no me lo explicaba nadie y cuando recien empezaba me costo entender punteros :p
 

Franeg95

CARP
Ex-Staff
El puntero te devuelve en que dirección de la memoria se encuentra tu dato.

De ahí a como lo operes corre por cuenta propia y del tipo de dato.
 

Mafia

Juree!
Lo mejor es practica, rompe la memoria trescientas veces, y a la siguiente, aprenderás a no romper nada (;
Agradezco tu consejo parra pero no estoy dispuesto a pagar 300 veces la memoria xD.


te lo explico bien simple

un puntero se declara de la siguiente manera

tipo *puntero;


un puntero es una variable que almacena la direccion de memoria de otra variable que contiene el dato que vos queres usar.
en la declaracion que te puse arriba tipo es el tipo del objeto apuntado que puede ser un tipo primitivo (int, char, float, etc) o derivado (structs, uniones, etc, etc)
Aver si entendí, Declaro una variable como puntero que apunta a una direccion de memoria que hay en una variable. Y mediante esto puedo modificarla? No entendi muy bien
 

Shab

Aprendiz Lvl 2
Mafia dijo:
Lo mejor es practica, rompe la memoria trescientas veces, y a la siguiente, aprenderás a no romper nada (;
Agradezco tu consejo parra pero no estoy dispuesto a pagar 300 veces la memoria xD.


te lo explico bien simple

un puntero se declara de la siguiente manera

tipo *puntero;


un puntero es una variable que almacena la direccion de memoria de otra variable que contiene el dato que vos queres usar.
en la declaracion que te puse arriba tipo es el tipo del objeto apuntado que puede ser un tipo primitivo (int, char, float, etc) o derivado (structs, uniones, etc, etc)
Aver si entendí, Declaro una variable como puntero que apunta a una direccion de memoria que hay en una variable. Y mediante esto puedo modificarla? No entendi muy bien

Mira, las variables se guardan en la memoria no? bueno, entonces las variables tienen un direccion de memoria donde esta guardado el dato

El puntero lo que almacena es la direccion de memoria en la cual se localiza la variable y trabajar con el valor que se halla en ESA direccion

volviendo al ejemplo que te puse:

? p es la DIRECCION DE MEMORIA DE "a" (una direccion de memoria puede ser por ejemplo: 12FF7C)
? *p es el valor almacenado en esa direccion de memoria.

Como p apunta a "a", la direccion de memoria es la de "a" y el valor almacenado en esa direccion es el valor de "a"

Por lo tanto si modificas el valor de esa direccion de memoria con el puntero, estas modificando a "a"

Otro ejemplo? Aver si con esto se entiende mas jaja

C++:
 
#include stdio.h
 
void dar_vuelta(int *, int *);
 
main()
{
      int a = 230, b = 834;
      printf("a = %d <span style="color: #666666; font-weight: bold;">\n b = %d"</span>,a,b);
      dar_vuelta(&a,&b);
      printf("a = %D <span style="color: #666666; font-weight: bold;">\n b = %d"</span>,a,b);
}
 
void dar_vuelta(int *v1, int* v2)
{
    int j = *v1;
    *v1 = *v2;
    *v2 = j;
}
Explicacion:

los parametros de dar_vuelta son punteros a entero
estos reciben como valor la direccion de memoria de "a" y "b"

entonces
v1 = direccion de memoria de "a"
v2 = direccoin de memoria de "b"

*v1 = valor almacenado en la direccion de memoria almcenada en v1
*v2 = valor almacenado en la direccion de memoria almacenada en v2

Entonces si modificas *v1 estas modificando a "a" porque estas cambiando el valor almacenado en ESA direccion de memoria, que es la direccion de "a"

Se entendio? jeje
 

Franeg95

CARP
Ex-Staff
Mafia dijo:
Lo mejor es practica, rompe la memoria trescientas veces, y a la siguiente, aprenderás a no romper nada (;
Agradezco tu consejo parra pero no estoy dispuesto a pagar 300 veces la memoria xD.
No se refiere a una ruptura física sino mas bien a que arruines los datos, lo cual no presenta ningún peligro, ya que la memoria que usa el SO esta protegida para ese tipo de cosas.
 

Shab

Aprendiz Lvl 2
Franeg95 dijo:
Mafia dijo:
Lo mejor es practica, rompe la memoria trescientas veces, y a la siguiente, aprenderás a no romper nada (;
Agradezco tu consejo parra pero no estoy dispuesto a pagar 300 veces la memoria xD.

No se refiere a una ruptura física sino mas bien a que arruines los datos, lo cual no presenta ningún peligro, ya que la memoria que usa el SO esta protegida para ese tipo de cosas.
claro, en el caso mas grave tendras que reiniciar la pc jaja
 

0xDEADBEEF

Vicinity of obscenity
Ex-Staff
En el caso de que colapsaras el pc hasta que explotara, quizás tuvieses que reiniciar el pc, pero lo dudo..

Lo de romper la memoria, es como un error en tiempo de ejecución, no importa eso, es solo para que aprendas, mientras no hagas barbaridades extremas no hay por que preocuparse.
 

Shab

Aprendiz Lvl 2
•Parra dijo:
En el caso de que colapsaras el pc hasta que explotara, quizás tuvieses que reiniciar el pc, pero lo dudo..

Lo de romper la memoria, es como un error en tiempo de ejecución, no importa eso, es solo para que aprendas, mientras no hagas barbaridades extremas no hay por que preocuparse.

por eso dije "en el caso mas grave" pero es muy improbable para juniors como nosotros jajaj :p
 

Mafia

Juree!
Shab dijo:
Mafia dijo:
Lo mejor es practica, rompe la memoria trescientas veces, y a la siguiente, aprenderás a no romper nada (;
Agradezco tu consejo parra pero no estoy dispuesto a pagar 300 veces la memoria xD.


te lo explico bien simple

un puntero se declara de la siguiente manera

tipo *puntero;


un puntero es una variable que almacena la direccion de memoria de otra variable que contiene el dato que vos queres usar.
en la declaracion que te puse arriba tipo es el tipo del objeto apuntado que puede ser un tipo primitivo (int, char, float, etc) o derivado (structs, uniones, etc, etc)
Aver si entendí, Declaro una variable como puntero que apunta a una direccion de memoria que hay en una variable. Y mediante esto puedo modificarla? No entendi muy bien

Mira, las variables se guardan en la memoria no? bueno, entonces las variables tienen un direccion de memoria donde esta guardado el dato

El puntero lo que almacena es la direccion de memoria en la cual se localiza la variable y trabajar con el valor que se halla en ESA direccion

volviendo al ejemplo que te puse:

? p es la DIRECCION DE MEMORIA DE "a" (una direccion de memoria puede ser por ejemplo: 12FF7C)
? *p es el valor almacenado en esa direccion de memoria.

Como p apunta a "a", la direccion de memoria es la de "a" y el valor almacenado en esa direccion es el valor de "a"

Por lo tanto si modificas el valor de esa direccion de memoria con el puntero, estas modificando a "a"

Otro ejemplo? Aver si con esto se entiende mas jaja

C++:
 
#include stdio.h
 
void dar_vuelta(int *, int *);
 
main()
{
      int a = 230, b = 834;
      printf("a = %d <span style="color: #666666; font-weight: bold;">\n b = %d"</span>,a,b);
      dar_vuelta(&a,&b);
      printf("a = %D <span style="color: #666666; font-weight: bold;">\n b = %d"</span>,a,b);
}
 
void dar_vuelta(int *v1, int* v2)
{
    int j = *v1;
    *v1 = *v2;
    *v2 = j;
}
Explicacion:

los parametros de dar_vuelta son punteros a entero
estos reciben como valor la direccion de memoria de "a" y "b"

entonces
v1 = direccion de memoria de "a"
v2 = direccoin de memoria de "b"

*v1 = valor almacenado en la direccion de memoria almcenada en v1
*v2 = valor almacenado en la direccion de memoria almacenada en v2

Entonces si modificas *v1 estas modificando a "a" porque estas cambiando el valor almacenado en ESA direccion de memoria, que es la direccion de "a"

Se entendio? jeje

Volviendo al tema de punteros.. Ya lo entendi jaja ! Gracias a todos .
 

Shab

Aprendiz Lvl 2
Mafia dijo:
Shab dijo:
Mafia dijo:
Agradezco tu consejo parra pero no estoy dispuesto a pagar 300 veces la memoria xD.




Aver si entendí, Declaro una variable como puntero que apunta a una direccion de memoria que hay en una variable. Y mediante esto puedo modificarla? No entendi muy bien

Mira, las variables se guardan en la memoria no? bueno, entonces las variables tienen un direccion de memoria donde esta guardado el dato

El puntero lo que almacena es la direccion de memoria en la cual se localiza la variable y trabajar con el valor que se halla en ESA direccion

volviendo al ejemplo que te puse:

? p es la DIRECCION DE MEMORIA DE "a" (una direccion de memoria puede ser por ejemplo: 12FF7C)
? *p es el valor almacenado en esa direccion de memoria.

Como p apunta a "a", la direccion de memoria es la de "a" y el valor almacenado en esa direccion es el valor de "a"

Por lo tanto si modificas el valor de esa direccion de memoria con el puntero, estas modificando a "a"

Otro ejemplo? Aver si con esto se entiende mas jaja

C++:
 
#include stdio.h
 
void dar_vuelta(int *, int *);
 
main()
{
      int a = 230, b = 834;
      printf("a = %d <span style="color: #666666; font-weight: bold;">\n b = %d"</span>,a,b);
      dar_vuelta(&a,&b);
      printf("a = %D <span style="color: #666666; font-weight: bold;">\n b = %d"</span>,a,b);
}
 
void dar_vuelta(int *v1, int* v2)
{
    int j = *v1;
    *v1 = *v2;
    *v2 = j;
}
Explicacion:

los parametros de dar_vuelta son punteros a entero
estos reciben como valor la direccion de memoria de "a" y "b"

entonces
v1 = direccion de memoria de "a"
v2 = direccoin de memoria de "b"

*v1 = valor almacenado en la direccion de memoria almcenada en v1
*v2 = valor almacenado en la direccion de memoria almacenada en v2

Entonces si modificas *v1 estas modificando a "a" porque estas cambiando el valor almacenado en ESA direccion de memoria, que es la direccion de "a"

Se entendio? jeje

Volviendo al tema de punteros.. Ya lo entendi jaja ! Gracias a todos .

de nada che! :) cualqui pregunta :)
 
Estado
Cerrado para nuevas respuestas.
Arriba