Soy nuevo en c

Iniciado por Pinkof, 22 Junio 2012, 19:29 PM

0 Miembros y 1 Visitante están viendo este tema.

Pinkof

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

avesudra

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 (cpp) [Seleccionar]
char letra; //supongamos que esta variable tiene un valor de posicion en la memoria de 0x0041000
char *pletra;//creamos un puntero de tipo char
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.

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 (cpp) [Seleccionar]
char letra = "b";// creamos una variable de tipo char y le asignamos un valor en este caso b;
char *pletra;// creamos un puntero de tipo char
pletra = &letra;// pasamos la dirección de letra a pletra y pletra apunta a letra que su contenido es "b"
//.............................................................................................
//entonces si imprimimos lo que hay en *pletra(utilizamos el * para saber el contenido no el valor de memoria).
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!
Regístrate en

The Swash

#2
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 "*".
int nVal = 5;
int * lpVal = &nVal
/* 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:
int * p = (int*) malloc(5 * sizeof(int));
/* *(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.


Pinkof

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 =)

Don Pollo

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

Cita de: Don Pollo en 16 Marzo 2011, 01:19 AM
Hay dos formas de declarar vectores o matrices en C/C++. Una de ellas es declararlos de forma estática, tal que así:

[tip] vector[tam];

//[tip] es el tipo de dato que contiene el vector
//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:

[tip] matriz[filas][columnas]
//[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:

vector[4]=7
//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:

[tip] *puntero;
//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:

puntero = ([tip]*)malloc(tam*sizeof([tip])); //Si lo queremos con casting en C
ó
puntero = malloc(tam*sizeof([tip])); //Si lo queremos sin casting en C
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:

[tip] **puntero;

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

*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:

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!





david_BS

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