Programación General > C/C++

 Duda novato punteros

(1/4) > >>

nmaxcom:
Buenas, estoy empezando con C++ leyendo de aquí y de allá y me he atascado con el tema punteros en este manual:


--- Citar ---int *entero;
Debes tener muy claro que "entero" es una variable del tipo "puntero a int", y que
"*entero" NO es una variable de tipo "int".
--- Fin de la cita ---

De acuerdo, una variable puntero sólo almacenará una dirección de memoria a la que apunta. O sea que nunca puede hacer de "contenedor" o de variable normal, nunca almacenará nada que no sea una dirección de memoria, ¿no? Más abajo leo:


--- Código: C++ ---int main(){int*a;a=new int;*a=10;} 
Acostumbrado a leer cosas tipo a = &variable, en las que se inicia al puntero y hace que apunte a una variable, me surge la duda.
Si *a, por ser puntero, no puede hacer nunca de variable normal sino que en este caso es un puntero de tipo int que debería apuntar a una variable...donde está exactamente el número 10 almacenado? La teoría me dice que "a" sólo está apuntando a una variable de tipo int que contiene el numero 10. Y bien, donde está esa variable? Como se llama?

Gracias!

m0skit0:

--- Cita de: "nmaxcom" ---La teoría me dice que "a" sólo está apuntando a una variable de tipo int que contiene el numero 10. Y bien, donde está esa variable? Como se llama?
--- Fin de la cita ---
No existe tal variable. El dato ya lo tienes referenciado por *a. Ten en cuenta que en un computador, los datos se almacenan en la memoria, y ésta no es más que un conjunto de celdas con direcciones. Un puntero es simplemente lo que su nombre indica, un apuntador a una dirección de memoria (en realidad ES una dirección de memoria, igual que todas las variables).

Si quieres realmente entender qué se esconde detrás de un lenguaje de programación de alto nivel (como C y C++), te aconsejo unos cuantos enlaces:

http://en.wikipedia.org/wiki/Von_Neumann_architecture
http://www.springerlink.com/content/978-1-84882-255-9
http://www.intel.com/products/processor/manuals/

nmaxcom:
Referenciado...pero donde? Es que no le veo la lógica con lo que he leído. A ver si me puedes ayudar de otra forma:

Por qué esto es incorrecto


--- Código: C++ ---int main (){    char *flux;    *flux = "test";} 
Pero en cambio esto no?


--- Código: C++ ---int main (){    char *flux = "test";}  

Y a parte de esto, para no darte tanto la brasa, hay alguna documentación, aunque sea muy extensa, sobre los punteros en C++? Que se centre en el tema de punteros. Por que he mirado incluso algun videotutorial sobre punteros y no me surge ninguna duda, pero con los ejemplos que pone este manual ya me pierdo y veo que me falta mucho por entender.
Por que si no investigo y entiendo la profunda raiz de todas las cosas y el "por qué" no soy captar de pillar ni las más sencillas :P

Muchas gracias

m0skit0:
Primero, te aclaro una cosilla: en un SO moderno los recursos del ordenador son administrados por el mismo SO. Es decir, las aplicaciones que corren encima del SO necesitan "perdirle" al SO permiso para usar ciertos recursos, que el mismo SO les asigna. Aclarado esto, sigamos.


--- Código: C ---int main (){    char *flux = "test";} Aquí conviene tener en cuenta cómo funciona un compilador. Al asignar un valor en la misma declaración del puntero (es decir, una asignación estática), el compilador automáticamente reserva la memoria necesaria para la cadena de caracteres. Aquí tienes otro ejemplo de asignación estática:


--- Código: C ---int main (){    char flux[20];} Reserva un espacio de 20 char.

Sin embargo, aquí:


--- Código: C ---int main (){    char *flux;    *flux = "test";} Sólo declaras un puntero, pero no reservas la memoria (que debes pedir al SO). Es decir, sólo reservas la memoria para el puntero (32 bits por ejemplo), pero no para la cadena "test" (6 caracteres, 6 bytes). Tendrías primero que pedírsela al SO:


--- Código: C ---int main (){    char *flux;    int len;    // Tamaño de la cadena    len = strlen("test");    // Reservamos la memoria (tamaño de cadena + 1)    flux = malloc(len+1);    // Ponemos la memoria a 0    memset(flux, 0, len+1);    // Copiamos la cadena en la memoria reservada    strcpy(flux, "test");} malloc() es el equivalente en C de new en C++, pero para tipos que no son clases (como char*). De todas formas, en C++ es aconsejable usar la clase string en vez de char* y utilizar siempre punteros a clases.

Ten en cuenta que el manejo de punteros nos da más control sobre qué estamos haciendo, pero también convierte tareas aparentemente sencillas en bastante más tediosas que en otros lenguajes de más alto nivel, que abstraen este tipo de detalles. Sin embargo, con tener más control podemos hacer que nuestro código corra más rápido que código generado automáticamente.


--- Cita de: "nmaxcom" ---hay alguna documentación, aunque sea muy extensa, sobre los punteros en C++?
--- Fin de la cita ---
Los punteros en C++ son idénticos a los de C. Yo siempre aconsejo documentación en inglés porque suele ser mucho más completa y más fácilmente accesible:

http://www.google.es/search?client=fire ... gle+Search

Cualquier duda, no dudes en postear, pa eso estamos ;)

Eternal Idol:
No; el problema aca no es de memoria:

--- Código: C++ ---int main (){  char *flux;  *flux = "test";} 
El problema es que no podes asignarle a un caracter un puntero a cadena, *flux esta desreferenciando el puntero al primer caracter al que apunta flux (indefinido). Esto es perfectamente valido:


--- Código: C++ ---int main (){  char *flux;  flux = "test";} 
Lo normal es que el compilador ponga esa cadena en la seccion de datos de solo lectura.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa