elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Soy nuevo en c
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Soy nuevo en c  (Leído 4,022 veces)
Pinkof

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Soy nuevo en c
« en: 22 Junio 2012, 19:29 pm »

Hola gente estoy aprendiendo c y me quedo trancado en la parte de punteros no puedo entender que hace exactamente si alguien me puede ayudar se lo agradeceria y si me ponen un ejemplo sencillo y entendible para alguien que nunca manejo c mejor jeje

Gracias Hackers:P


En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Soy nuevo en c
« Respuesta #1 en: 22 Junio 2012, 21:34 pm »

Un puntero es una variable de determinado tipo(char, int ...) que como su nombre indica apunta.¿A qué? a una dirección de memoria , a otra variable... Con estos tipos de variables(los punteros) se utilizan dos tipos de operadores el ampersand (&) y el  asterisco (*):

El operador ampersand(&) se utiliza para que nos devuelva el valor donde está guardado el contenido de una variable en la memoria. Por ejemplo.
Código
  1. char letra; //supongamos que esta variable tiene un valor de posicion en la memoria de 0x0041000
  2. char *pletra;//creamos un puntero de tipo char
  3. pletra = &letra;// y ahora lo que hacemos es pasar el valor de la posición de memoria de letra con el ampersand(&) al puntero para que este apunte a esa dirección de memoria.
  4.  
El operador asterisco(*) , se le llama operador de desreferencia , porque lo que hace es devolvernos el valor que hay en la dirección de memoria que apunta el puntero. Por ejemplo:
Código
  1. char letra = "b";// creamos una variable de tipo char y le asignamos un valor en este caso b;
  2. char *pletra;// creamos un puntero de tipo char
  3. pletra = &letra;// pasamos la dirección de letra a pletra y pletra apunta a letra que su contenido es "b"
  4. //.............................................................................................
  5. //entonces si imprimimos lo que hay en *pletra(utilizamos el * para saber el contenido no el valor de memoria).
  6. printf("%c", *pletra); //----> saldra b pues es el caracter al que estabamos apuntando.

Si algún programador más experimentado tiene que corregir algo que lo haga , yo ni mucho menos entiendo mucho de punteros , es la realidad, pero bueno solo por el simple hecho de ayudar...

PD: De todas maneras consiguete un buen libro , y lee mucho y antes de preguntar busca en internet :)

¡Un Saludo!


En línea

Regístrate en
The Swash

Desconectado Desconectado

Mensajes: 194


Programmer


Ver Perfil WWW
Re: Soy nuevo en c
« Respuesta #2 en: 22 Junio 2012, 23:56 pm »

Hola,

Básicamente se puede decir que un puntero es un tipo de variable de tamaño DWORD, su contenido es una dirección de memoria que contiene un valor.
Aclarando un poco:

Toda variable tiene un valor, solo que el valor de un apuntador es una dirección en memoria. Para asignarse se utiliza el operador "&" el cual proporciona la dirección de memoria de una variable, y para hacer referencia al contenido de un puntero se utiliza el operador de desreferencia "*".
Código
  1. int nVal = 5;
  2. int * lpVal = &nVal
  3. /* nVal == *lpVal;*/

Los famosos arreglos no son más que punteros a un determinada cantidad de un determinado tipo de datos, dicha información puede desreferenciarse utilizando índices o el operador de desreferencia:
Código
  1. int * p = (int*) malloc(5 * sizeof(int));
  2. /* *(p + n) == p[n] */

Creo que te conviene bastante leer un manual completo ya que pueden haber bastantes casos y detalles que explicar, pero en general:
Un puntero es una variable cuyo contenido es una dirección en memoria.

Un saludo,
Iván Portilla.

« Última modificación: 22 Junio 2012, 23:59 pm por The Swash » En línea

Pinkof

Desconectado Desconectado

Mensajes: 26


Ver Perfil
Re: Soy nuevo en c
« Respuesta #3 en: 23 Junio 2012, 02:23 am »

Gracias por responder pero creo que ya entendi mas o menos lo que hace el puntero ahora lo pondre en practica y les avisare cualquier duda en este post.

Por cierto entendi mas el de avesudra por usar terminos mas sencllios y entendibles en los manuales no entiendo su explicacion.. pero como lo hizo avesudra es re sencillo entenderlo :D gracias a los 2 por sus respuesta =)
En línea

Don Pollo

Desconectado Desconectado

Mensajes: 74

/* No comments */


Ver Perfil
Re: Soy nuevo en c
« Respuesta #4 en: 26 Junio 2012, 12:06 pm »

Hace más de un año respondí a un post parecido a este:

Hay dos formas de declarar vectores o matrices en C/C++. Una de ellas es declararlos de forma estática, tal que así:

Código
  1. [tip] vector[tam];
  2.  
  3. //[tip] es el tipo de dato que contiene el vector
  4. //tam es el tamaño (el número de "casillas") que va a tener dicho vector

Este tipo de declaración se caracteríza por el hecho de que el vector se crea justo al comienzo de la función que se está ejecutando y tiene un tamaño invariable. En este tipo de declaración no puedes meter más elementos que "casillas" tiene el vector, pero si puedes meter menos, con el consecuente desperdicio de memoria que produce al ser estático y no poder variar su tamaño.
Para las matrices estáticas sería algo parecido, pero con dos tamaños:

Código
  1. [tip] matriz[filas][columnas]
  2. //[filas] es el número de filas que va a tener la matriz. Idem para [columnas]

Para acceder a la "casilla" de un vector estático sólo hay que saber la posición de dicha "casilla", teniendo en cuenta que empieza desde 0. Por ejemplo:

Código
  1. vector[4]=7
  2. //Estamos metiendo en la "casilla" 5 el valor 7.

Por supuesto, cada "casilla" del vector se puede operar con ella como si fuese una variable cualquiera.

En la declaración de vectores y matrices por punteros la cosa cambia. En este tipo de declaración el tamaño si es variable y podremos modificarlo a nuestro antojo.
Un puntero es una variable que apunta a otra variable. Sabiendo esto, para definir un vector por punteros, lo que debemos hacer primero es definir un puntero que inicialmente no apuntará a nada (realmente apuntará a basura) para después hacer que apunte a nuestro vector/matriz.

Primero declaramos el puntero:

Código
  1. [tip] *puntero;
  2. //En caso de ser un vector

Para reservar memoria para el vector al que queremos que apunte nuestro puntero, debemos usar la función "malloc" (si se trata de C) o la función "new" (si se trata de C++).
Si se trata de C haremos lo siguiente:

Código
  1. puntero = ([tip]*)malloc(tam*sizeof([tip])); //Si lo queremos con casting en C
  2. ó
  3. puntero = malloc(tam*sizeof([tip])); //Si lo queremos sin casting en C
  4. puntero = new [tip][tam] //Si se trata de C++

Malloc hace que todas las "casillas" que hemos declarado estén llenas de basura, para ello existe otra función llamada calloc que hace lo mismo que malloc pero inicializa las "casillas" a 0. Para añadir elementos al vector disponemos de la función realloc.
Y con esto ya tenemos definido nuestro vector dinámico en memoria.

El caso de la matriz es más complejo, ya que deberemos crear un puntero doble. Esto es un puntero que apunta a otro puntero. Esto es así, porque deberemos crear un puntero que apunte a un vector de punteros y hacer que cada "casilla" de este vector, apunte a una fila de la matriz. Algo así:


Para ello, debemos definir primero nuestro puntero doble:

Código
  1. [tip] **puntero;

Ahora reservamos tanta memoria para el vector de punteros como filas queremos que tenga la matriz:

Código
  1. *puntero = ([tip]*)malloc(num_filas*sizeof([tip])); // Aquí no tengo muy claro si sería [tip]* o [tip]**

Y por último, deberemos crear un bucle para ir reservándo memoria para cada "casilla" de ese vector:

Código
  1. for(i=0; i<num_filas; i++) puntero[i] = ([tip]*)malloc(num_columnas*sizeof([tip]));

Siempre que quieras añadir o quitar columnas, deberás ejecutar el bucle por seguridad para que al final unas filas no tengan más columnas que otras.
Y así, ya tenemos declarado nuestra matriz, con elementos de tipo [tip], en memoria.

En estos ejemplos últimos sólo he usado la sintaxis de C, si quieres hacerlo para C++, sólo tienes que cambiar la sintaxis por la que te puse en la declaración del primer vector unidimensional (la de "new").

En resumen: Los vectores estáticos se crean en tiempo de compilación y son de tamaño invariable y los dinámicos se crean en tiempo de ejecución y son de tamaño variable.

Ruego que si véis algún fallo me lo digáis para poder corregirlo.

Espero haberte sido de ayuda  ;D

Un saludo!




En línea

david_BS

Desconectado Desconectado

Mensajes: 99



Ver Perfil WWW
Re: Soy nuevo en c
« Respuesta #5 en: 1 Julio 2012, 19:12 pm »

muy buena tu explicación final. aunque algunos compiladores modernos usan vla, osea los vectores que consideramos estáticos son implícitamente dinámicos.
http://en.wikipedia.org/wiki/Variable-length_array
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
nuevo userbar (nuevo logo xD) « 1 2 3 »
Diseño Gráfico
Nakp 20 11,271 Último mensaje 1 Enero 2007, 18:41 pm
por Nakp
Nuevo OS, Nuevo Software... « 1 2 »
Multimedia
Saberuneko 17 10,448 Último mensaje 6 Julio 2010, 17:38 pm
por Saberuneko
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines