Autor Tema: diferencia entre punteros y variables en C (lenguajec) dificultad aprendizaje  (Leído 23679 veces)

Mayen Olivares

  • Sin experiencia
  • *
  • Mensajes: 48
    • Ver Perfil
He estado leyendo sobre punteros en C y por más que lo leo y lo releo para mí un puntero es una variable con un asterisco al lado, sé que estoy equivodado pero no logro entenderlo
« Última modificación: 04 de Junio 2018, 19:19 por Ogramar »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #1 en: 31 de Mayo 2012, 14:33 »
Ciertamente el tema de punteros no es una cuestión fácil de entender. La primera cuestión sería tratar de pensar que un identificador como numeroCoches lleva asociados varios atributos: un atributo sería la localización en memoria expresada como una dirección reconocible por el ordenador, supongamos que esa dirección fuera x80434034. Otro atributo sería el valor contenido en esa dirección de memoria, que en un momento dado puede ser 34 y en otro 47. También el identificador tiene otros atributos como por ejemplo el tipo de dato (por ejemplo "Integer").

Ahora, ¿Qué es un puntero? Un puntero sería un identificador cuyo contenido en lugar de ser un valor es una dirección de memoria (una referencia). Para acceder al valor que hay en esa dirección de memoria se dice que hay que desreferenciar el puntero: es decir, ir al valor contenido en la referencia en vez de a la referencia en sí.

Mayen Olivares

  • Sin experiencia
  • *
  • Mensajes: 48
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #2 en: 03 de Junio 2012, 10:12 »
Si por favor pudieras poner un ejemplo

Mayen Olivares

  • Sin experiencia
  • *
  • Mensajes: 48
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #3 en: 05 de Junio 2012, 01:07 »
Me refiero a un ejemplo donde se vea la diferencia entre variable y puntero

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2050
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #4 en: 07 de Junio 2012, 14:38 »
En C:

int x; es una declaración de variable

int* z; es una declaración de puntero.

El puntero tiene contenido null hasta que no se le asigna una localización de memoria, lo cual se puede hacer usando malloc.

Una vez le hayas asignado una localización de memoria, puedes desreferenciarlo y asociarle un valor así: *z = 7;

Pero recuerda que el puntero es puntero (aunque lo puedas desreferenciar) y que la variable es variable.

Alastor8890

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #5 en: 05 de Julio 2012, 04:20 »
En realidad no hay mucho que buscarle, la definición en sí de un puntero es sencilla, lo que se complica es el uso; aqui te dejo mi explicación de punteros, espero y te sirva:

Un puntero es una variable que como valor almacena la dirección de otra variable. El puntero puede ser inicializado de tres formas: 1) igualado a NULL 2) igualado a una dirección de una variable 3) igualado a 0 (siendo este la única constante literal con la que se puede declarar un puntero). El puntero al declararse debe pensarse a qué tipo de variable va a apuntar, es decir, si la variable en cuestion es de tipo int, el puntero debe ser de tipo int. Ejemplo:

Código: [Seleccionar]
int y=1;
int *yPtr;
ptr=&var;

Ahora te explico el ejemplo: se declara e inicializa la variable y=1 de tipo int, acto seguido se declara el puntero(o apuntador) *yPtr de tipo int. Nota que se hace uso del operador & el cual extrae la dirección de la variable "y" para asignar ese valor (en Hexadecimal) a Ptr. El operador de indirección (*) al anteceder al Ptr (*yPtr) hace referencia al valor de la variable y, es decir *yPtr==1. Con el siguiente ejemplo extraido del libro de Deitel espero que te quede mas claro todo esto:

#include<stdio.h>

Código: [Seleccionar]
main()
{
    int a;            /*Se declara a de tipo entero*/
    int *aPtr;     /*aPtr es un puntero a un entero*/

    a=7;           
    aPtr=&a;     /*Se le asigna a aPtr la dirección de a*/
   
    printf("La dirección de a es %p\n
               El valor de aPtr es %p\n\n",&a,aPtr);
    printf("El valor de a es %d\n
               El valor de *aPtr es %d",a,*aPtr);
}

Lo que te imprimirá en pantalla lo siguiente:

La dirección de a es FFF4
El valor de aPtr es FFF4

El valor de a es 1
El valor de *aPter es 1

Un uso común de apuntadores es el de pasar valores por referencia a una función cuando se necesita que esta te devuelva mas de un valor.

Espero que esta información te haya servido de algo. Saludos.

Mayen Olivares

  • Sin experiencia
  • *
  • Mensajes: 48
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #6 en: 06 de Julio 2012, 14:43 »
Genial Alastor!!! Un montón de gracias por esa explicación y ese código de ejemplo. Para mí el concepto de puntero me resulta un poco complejo porque no llego a entender bien qué es una dirección de memoria, pero me has aclarado un montón. Mil gracias

Alastor8890

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #7 en: 06 de Julio 2012, 21:13 »
Bueno, algo importante para programar es conocer también la parte física de la pc (hardware), en este caso es importante saber como se constituye la memoria RAM; la memoria RAM tiene slots en el que cada uno se almacena información. La dirección de memoria es el lugar en el que se encuentra esa información. Tomando el ejemplo que te dí FFF4 es el número en Hexadecimal que te indica la posición exacta en la que se aloja esa información, es como dar las coordenadas de un objeto. Entonces un apuntador tiene como valor asignado "las coordenadas" de una variable; ATENCIÓN: el puntero tiene una dirección de memoria diferente a la variable. Por ejemplo:

El puntero *aPtr se encuentra alojado en la posición AF15 y contiene como valor asignado FFF4, es decir, el puntero tiene una posición también dentro de la memoria(posición AF15), que a su vez como valor el puntero contiene la posición de una variable.

aPtr = FFF4
en la posición FFF4 se encuentra la variable a
a = 1
aPtr se encuentra en la posición AF15

Por si esto se te hace muy enredoso véelo de esta forma:

Supón que tu memoria RAM está dividida en 16 secciones organizadas de la siguiente forma:

1   2     3    4    5    6    7    8
9  10  11  12  13  14  15  16

declaras int a; entonces se aloja a en la posición 7, la dirección de memoria de a es 7.
declaras el puntero int *aPtr, aPtr se aloja en la posición 15, inicializas el puntero aPtr = &a, ahora el valor de aPtr es 7, o sea aPtr apunta a la posición 7 de la memoria y en esa posición se encuentra a.

Es un poco enredoso, espero que te sirva para aclarar tus dudas.

patagonico

  • Sin experiencia
  • *
  • Mensajes: 28
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #8 en: 07 de Julio 2012, 20:29 »
Hola Alastor, tus explicaciones me parecen muy buenas, al menos bastante claras para un tema complicado como este. He seguido el hilo y creo enteder más o menos todo lo que explicas, lo que no acabo de ver es lo que dices

algo importante para programar es conocer también la parte física de la pc (hardware)

Quiero decir que aunque no me considero programador sí he programado algo y nunca he usado punteros para programar y lo que no le veo es la aplicación práctica a esto de los punteros

Alastor8890

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #9 en: 08 de Julio 2012, 04:04 »
hola pantagonico, pues mira, no se si has visto cómo se pasan los parámetros a las funciones, por si no te explico:

Existen dos formas de pasar parámetros a una función, por valor y por referencia:

-Parametros por valor: Son todos aquellos parámetros que entran a la función llamada y se hace una copia de estos para poderlos manipular dentro de la función llamada; al regresar el control a la función llamadora tales parámetros no sufrieron ningún cambio fuera de la función llamada.

-Parámetros por referencia: En este tipo de parámetros todo lo que se le haga a los parámetros que entran a la función llamada es modificado si es que se le hizo un cambio.

Por defecto todos los parámetros que entran a una función en C son por valor, como ya sabes las funciones regresan siempre a lo más un valor. Hay veces que se requiere que una función regrese más de un resultado, esto se puede lograr gracias a que en C existe la posibilidad de simular una pasada de parámetros por referencia; la forma de hacerlo es con arrays o punteros, ahí es donde radica la efeciencia del uso de los punteros, según he visto se podría considerar los punteros como la parte de C que lo hace tan poderoso. Eso si, es a veces complicado entender bien el alcance de esto, pero conforme vayas usándolos verás lo eficiente y NECESARIO que resulta usar punteros en C.

Tengo como 1 mes y medio aprendiendo sólo de libros, manuales y foros esto del C y apenas hace poco que empecé a usar punteros empecé a ver que tan necesarios son, al principio parece algo sin mucha gracia, pero conforme vayas avanzando ya te darás cuenta y te acordarás de mi (jejejeje) y de todos los autores de libros de C y profesores (si es que estás llevando clases).

Saludos. Cualquier duda que esté a mi alcance responder aquí estoy.

patagonico

  • Sin experiencia
  • *
  • Mensajes: 28
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #10 en: 09 de Julio 2012, 12:39 »
Interesante todo esto que comentas... Aunque hay algunas cosas que no me cuadran. Por ejemplo dices que en C siempre que se pasan parámetros a funciones se pasan por valor. Sin embargo en otros lenguajes funciona de otra manera, por ejemplo en Java se pasa parámetros por referencia y en Visual Basic se puede especificar si se pasan por parámetros o por referencia sin hacer uso de punteros.

Lo que me pregunto yo es: si en otros lenguajes se puede hacer sin usar punteros, ¿por qué en c no? ¿No sería más ventajoso tener formas de pasar parámetros como quisiera el usuario sin necesidad de usar punteros?


Alastor8890

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #11 en: 09 de Julio 2012, 18:15 »
Bueno, al pasar parámetros por referencia se tiene el riezgo de modificarlos sin que uno quiera hacerlo a la hora de estar manipulándolos, al pasarse por valor, los datos se protegen, los punteros se usan cuando es necesario cambiar esos parámetros, es por decir así hacer uso del mínimo privilegio para protección de las variables.

Vamos a retomar lo que decía de la necesidad de saber las partes físicas de la pc, los lenguajes que mencionas son lenguajes que se manejan únicamente a alto nivel, pero C, por constitución hace uso del lenguaje también de bajo nivel, algunos denominan a C como lenguaje de medio nivel (aunque no es bien aceptado); vamos a dejarlo en que C es un lenguaje de alto nivel con capacidades de bajo nivel. Programar en bajo nivel requiere la interacción directa con el hardware, el uso de punteros es el mejor ejemplo ya que interactúa directamente con la constitución de la RAM.

Te dejo una lista de ventajas de usar punteros:

En el caso de paso de variables a una función por dirección o referencia, es necesario emplear parámetros formales como punteros.

Permiten realizar operaciones de asignación dinámica de memoria.

Permiten efectuar operaciones con estructuras de datos dinámicas.

 De hecho Java si hace uso de punteros, aunque no de la forma en que se hace con C, te dejo unas páginas donde explican bien esto:

http://chuidiang.blogspot.mx/2005/09/los-punteros-de-java.html
http://www1.inei.gob.pe/biblioineipub/bancopub/Inf/Lib5069/4-3.HTM

manuromero73

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 40
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #12 en: 10 de Julio 2012, 19:25 »
Gracias alastor por todas esas explicaciones, yo voy todavía un poco retrasado con todo lo que es el estudio, de hecho lo primero que me había planteado era qué podía ser mejor para aprender a programar, si usar c o usar c++, me gustaría que me dieras tu opinión

Alastor8890

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #13 en: 11 de Julio 2012, 00:47 »
Pues se puede empesar por cualquier lenguaje, yo opté por C, ¿por qué?, pues nada mas para seguir la línea histórica, estaré con C, luego C++, luego Java, es como me dijo un profesor de Introducción a la Programación, estudia el lenguaje que necesites, si no necesitas uno en especial, te recomendaría C por fines propedéuticos.

manuromero73

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 40
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #14 en: 11 de Julio 2012, 17:07 »
te agradezco esa opinión alastor, me parece bastante razonable, gracias

Alastor8890

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 8
    • Ver Perfil
Re:diferencia entre punteros y variables en C
« Respuesta #15 en: 12 de Julio 2012, 06:06 »
Sale para eso estamos, cualquier cosa que pueda ayudar nada mas pregunta. Saludos

robicombi

  • Sin experiencia
  • *
  • Mensajes: 1
    • Ver Perfil
Re:diferencia entre punteros y variables en C (lenguajec)
« Respuesta #16 en: 26 de Noviembre 2017, 18:21 »
Perdón por revivir esto, pero la última línea sería:

Código: [Seleccionar]
yPtr = &y;

Si se estaba explicando con código real, tiene que haber "consistencia" en el ejemplo. Porque son "detalles" que hacen confundir a alguien que esté aprendiendo y entré a buscar información.

Si una variable, es un espacio de almacenamiento en la memoria.
Y un puntero, es una dirección de un espacio de almacenamiento.

Se les podrá decir de diferentes maneras, pero la finalidad es la misma: contener datos.
A uno se accede por el "nombre", y al otro por la dirección real.

Pero ya es algo muy específico, de elegir cuáles celdas de la memoria se van a usar para "optimizar" el rendimiento.

Así que opino lo mismo que Mayen Olivares.

Solo noto que se repiten constantemente las mismas explicaciones de "manual". En vez de salir de esa "rigidez" y explicar de la manera en que otra persona lo entienda.

Insisto, perdón por escribir esto en un post tan viejo. Pero son cosas que terminan por frustrar el proceso de aprender. Y por mucho menos, vi a personas dejando de querer aprender.

Los moderadores sabrán qué hacer con mi mensaje...

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2659
    • Ver Perfil
Buenas robicombi, por mi parte revivo este tema simplemente para decir que tu opinión parece razonable y seguramente acertada. Como moderador no veo que haya que hacer nada con tu mensaje.

Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".