ÍndiceFAQBuscarRegistrarseConectarse
 
  InvitadoTe RECORDAMOS que TODOS LOS LINKS de DESCARGA estan OCULTOS. Debes dejar un MENSAJE AGRADECIENDO el aporte.
Cuando actualices, en el 1° Mensaje apareceran los links!







Buscar
 
 

Resultados por:
 
Rechercher Búsqueda avanzada
Conectarse
Nombre de Usuario:
Contraseña:
Entrar automáticamente en cada visita: 
:: Recuperar mi contraseña
Últimos temas
» [E1 y E398]Monsterpack R@IDER 3 con elfs
Mar Dic 05, 2017 6:22 pm por chinitopex

» instalar juegos y aplicaciones samsung star, beatdj, ominia, etc..totalmente gratis.
Miér Sep 20, 2017 5:36 pm por Juan_Gamer6mail.com02

» [Android][IDIOMA] Instalación de los idiomas (incluye Español)
Miér Sep 13, 2017 10:33 am por SVTONOFRIETTI

» [L7]Monsterpack Andape v2.0 Multifont - iTunes
Vie Sep 08, 2017 5:36 pm por lynchdixon

» Nueva MP Extremoto v1.0 para L7i/e by jaims009
Vie Sep 08, 2017 5:33 pm por lynchdixon

» [L7]TAVO FULL 2.0! para Moto L7 - Boot: 08.DO
Vie Sep 08, 2017 5:30 pm por lynchdixon

» Monsterpack Ch3T0 v1.0 Light para L7 PARA BOOT 09.02
Vie Sep 08, 2017 5:28 pm por lynchdixon

» "The J0ker" (Batman - "The Dark Knight") For RIZR-KRZR
Jue Jun 29, 2017 8:52 pm por arnold motoman

» [(V360)Flash Original] Movistar Argentina
Vie Jun 02, 2017 8:04 pm por gasparmb

» windwos vista+windows 7 =windows vis7ta
Miér Mayo 17, 2017 5:34 am por arnold motoman

» Skin vista Nueva Version 176x220
Miér Mayo 17, 2017 5:28 am por arnold motoman

» Droid (Full) by ZduneX25
Miér Mayo 17, 2017 5:22 am por arnold motoman

» skin walkman plesetan by ROKRMAN
Miér Mayo 17, 2017 5:17 am por arnold motoman

» Skins para V3 varios 176x220
Mar Mayo 16, 2017 11:23 pm por arnold motoman

» Skin Droid-X 05/01/2011 176x220
Mar Mayo 16, 2017 11:17 pm por arnold motoman

» Coleccion skins by JithinSK
Lun Mayo 15, 2017 11:11 pm por arnold motoman

» 50 skins 176x220
Lun Mayo 15, 2017 11:04 pm por arnold motoman

» Ver los skins antes de subirlos a nuestro celular
Lun Mayo 15, 2017 9:35 pm por arnold motoman

» [E1-E398]NaN0 WalkMaN Repacked 49R
Vie Mayo 12, 2017 11:14 am por arnold motoman

» [E1 y E398]Monster Pack Alemurillo V.3.0+49R Elektro Mod 0.3
Dom Mayo 07, 2017 12:41 am por arnold motoman

De donde nos visitan
¿Quién está en línea?
En total hay 2 usuarios en línea: 0 Registrados, 0 Ocultos y 2 Invitados

Ninguno

La mayor cantidad de usuarios en línea fue 365 el Mar Oct 30, 2012 8:59 pm.
Estadísticas
Tenemos 59397 miembros registrados.
El último usuario registrado es inception1986.

Nuestros miembros han publicado un total de 113940 mensajes en 9887 argumentos.
Mejores posteadores
Fran Villa (8121)
 
chinitopex (3831)
 
Zona 1 (3724)
 
Decano (3080)
 
τчτus (1970)
 
lokomotiko (1790)
 
ll.YONA.ll (1742)
 
\ r0kR // (1683)
 
garcandrey (1624)
 
bill_kevin (1586)
 
Los posteadores más activos del mes



Comparte | 
 

 [tutorial]punteros en C

Ver el tema anterior Ver el tema siguiente Ir abajo 
AutorMensaje
τчτus

Ex-Moderador Master
Ex-Moderador Master
avatar


Masculino
Mensajes : 1970
Edad : 25
Pais : mexico
Empleo/Ocio : dormir
Registrado : 14/01/2009
Premios :

MensajeTema: [tutorial]punteros en C   Dom Abr 11, 2010 1:35 am

*******************
Extraido de elhacker.net
*******************

Punteros en C

Introducción

Cita de: Introducción
Tras años de aprender C a golpe de practicas (ISO, XC, STD, SPD, AAD, CASO, SAC, EISO ...) nos hemos decidido a realizar [Tienes que estar registrado y conectado para ver este vínculo] que esperamos os sea de gran ayuda en la realizacion de vuestras practicas en C.
Falta
por aclarar que esta pagina no esta dedicada al publico en general,
sino a cualquiera que empiece a programar en C y ya tenga nociones de
programacion.

Nacho & Pep.


Declaración de un puntero

Cita de: Declaración de un puntero
Un puntero, en C, se declara como sigue:
TIPO * nombre_puntero ;

Donde TIPO es cualquier tipo definido. Asi, un puntero a caracter se declararia de la siguiente forma:
char *pchar;


Diferencia entre "*" y "&"

Cita de: Diferencia entre "*" y "&"
En
C, al contrario que en otros lenguajes de programacion, se puede
obtener directamente la direccion de memoria de cualquier variable.
Esto es posible hacerlo con el operador unario "&"; asi:


char a; /* Variable 'a' de tipo char */

printf("la direccion de memoria de 'a' es: %p \n", &a);

Y para obtener lo apuntado por un puntero se utiliza el operador unario "*" de esta forma:

char a; /* Variable 'a' de tipo char */
char *pchar; /* Puntero a char 'pchar' */

pchar = &a; /* 'pchar' <- @ de 'a' */

printf("la direccion de memoria de 'a' es: %p \n", &a);
printf("y su contenido es : %c \n", *pchar);

Uno de los casos mas comunes donde se ve la relacion entre estos dos operadores es la declaracion y utilizacion de funciones:

void Funcion ( int *int_pointer )
/* Paso de una variable de tipo entero por REFERENCIA */
/* equivalente en Modula 2: PROCEDURE Funcion ( VAR a:INTEGER ) */
.
.
.
int a;
a=6;
Funcion ( &a ); /* ya que la declaracion de la funcion pide la


direccion de una variable de tipo entero */


Inicialización de un puntero

Cita de: Inicialización de un puntero
Hay
varias maneras de inicializar un puntero. Una ya ha sido vista en los
ejemplos del punto anterior ( pchar = &a; ); y al igual que el
resto, consiste basicamente en lo mismo; asignar una direccion de
memoria al puntero. Para hacer un paralelismo Modula-2 - C, en C existe
el equivalente al procedimiento NEW; la funcion malloc:

#include
#include

void *malloc( size_t size );

Donde 'size' es el numero de bytes que queremos reservar de tipo 'void', es decir, de cualquier tipo.

char *pchar;
int *pint;

pchar = [Tienes que estar registrado y conectado para ver este vínculo](6); /* pchar apunta al primer byte de los que se han


reservado

*/
pint = [Tienes que estar registrado y conectado para ver este vínculo](sizeof(int)*2);


/* pint apunta al primero de los dos enteros


que se han reservado
*/

Otra forma es inicializarlo con el valor de otro puntero.

.
.
.
int *pint2;

pint2 = pint;


Generación de codigo

Cita de: Generación de codigo
Para
comprender mejor algunos de los errores que se describen en la
siguiente sección, es necesario tener algunas nociones sobre
generacion de codigo y tratamiento de la memoria que realizan los
compiladores.
Empecemos por los distintos espacios de memoria existentes: la pila y el heap.
La
pila es el espacio de memoria donde se reservan todas las variables
locales y globales; esto significa que cada vez que se llama a una
funcion, sus variables se crean en tiempo de ejecucion en la pila, y se
destruyen en cuanto el flujo de ejecucion retorna al punto en que se
llamo a la funcion.
El heap (o monton) es el espacio de memoria
destinado a las peticiones explicitas de memoria (malloc en el caso del
C) y solo se pierde cuando se libera la memoria pedida ([Tienes que estar registrado y conectado para ver este vínculo]).
El
desconocimiento de estos espacios de memoria lleva a la generacion de
errores totalmente 'magicos' ("...yo he reservado el espacio y ya no
esta..." y similares). Algunos de estos errores pasamos a describirlos
mas adelante.


Errores mas comunes

Cita de: Errores mas comunes
AVISO: Si careces de conocimientos sobre la generacion de codigo, lee la [Tienes que estar registrado y conectado para ver este vínculo].

- Primer Caso

Cita de: Primer Caso
En el siguiente ejemplo se ilustra la inicializacion de un puntero a traves de una funcion.


void inicializa( char *buffer );
main()
{
char *buff;
.
.
.
buff = NULL;
inicializa( buff );
/* en este punto sigue valiendo NULL */
.
.
.
}
void inicializa( char *buffer )
{
buffer = malloc (1); /* reservamos memoria */
*buffer = 'a'; /* y la inicializamos */
}
.
.
.
Por que es incorrecta la inicializacion? Analicemos la pila al realizar la llamada:
| |
SP --->+---------------+
| copia de buff | <------- Parametro pasado a inicializa()
+---------------+
| @ de retorno |
+---------------+ <------- Hasta aqui llega la pila antes de
| buff = NULL | llamar a inicializa()
+---------------+
| resto de vars |
| locales al |
| main |
+---------------+
Tras la llamada tenemos lo siguiente en la pila
| |
+---------------+
| @ de 'a' |
+---------------+
| @ de retorno |
SP --->+---------------+
| buff = NULL |
+---------------+
| resto de vars |
| locales al |
| main |
+---------------+
y
'buff' sigue valiendo NULL, ya que en la funcion 'inicializa' lo unico
que se ha modificado es la copia de 'buff' que se ha pasado como
parametro en la pila.
La forma correcta de hacerlo es declarando la funcion asi:

void inicializa ( char **buffer);
main()
{
char *buff;
.
.
.
buff = NULL;
/* y pasando buff por referencia */
inicializa ( &buff );
/* ahora *buff = 'a' */
.
.
.
}
void inicializa ( char **buffer)
{
*buffer = malloc (1);
*buffer = 'a';
}
.
.
.
ya que la pila ahora queda de la siguiente forma tras la llamada:
| |
+---------------+
| @ de buff |
+---------------+
| @ de retorno |
SP --->+---------------+
| *buff = 'a' |
+---------------+
| resto de vars |
| locales al |
| main |
+---------------+


- Segundo Caso

Cita de: Segundo Caso
Ahora volvemos a hacer lo mismo de otra manera que parece correcta


char *inicializa();
void otra_funcion();
main()
{
char *buff;
.
.
.
buff = NULL;
buff = inicializa();
/* hasta aqui todo parece correcto */
otra_funcion();
/* aqui ya no se puede asegurar buff = "hola"*/
.
.
.
}
char *inicializa()
{
char buffer[5];
sprintf(buffer,"hola");
return(buffer);
}
.
.
.
Volvamos a analizar la pila:
| |
SP --->+---------------+
| 5 bytes para | <------- Espacio reservado para la variable
| buffer | local buffer
+---------------+
| @ de retorno |
+---------------+
| buff = NULL |
+---------------+
| resto de vars |
| locales al |
| main |
+---------------+
Cuando la funcion retorna tenemos la siguiente situacion:
| |
+---------------+
| "hola\0" | @ base de 'buffer'
+---------------+
| @ de retorno |
SP --->+---------------+
| buff= @buffer |
+---------------+
| resto de vars |
| locales al |
| main |
+---------------+
En
cuanto se llama a otra funcion, el espacio destinado a 'buffer' es
destinado a parametros de la llamada o a las variables locales de la
funcion invocada, con lo que "hola\0" sera machacado por otros valores.
Solo funcionaria si el resto de funciones invocadas no tuvieran ni
parametros ni variables locales.
La forma correcta de hacerlo seria:

char *inicializa();
main()
{
char *buff;
.
.
.
buff=inicializa();
.
.
.
}
char *inicializa()
{
char *buffer;
buffer = malloc (5);
sprintf(buffer,"hola");
return (buffer);
}
.
.
.
ya que tendriamos la siguiente disposicion en memoria:

PILA

HEAP

| |
|
|

+---------------+
|
|

| @ de "hola\0" | --------------+ |
|

+---------------+
| |
|

| @ de retorno |
| |
|
SP --->+---------------+
|
| |

| buff |
--------------+ |
|

+---------------+
| +-----------------+

| resto de vars |
+----->| "hola\0" |

| locales al |

+-----------------+
| main
|
|
|

+---------------+
|
|


- Tercer Caso

Cita de: Tercer Caso
El caso mas trivial de todos: no reservar espacio creyendo que la declaracion del puntero ya lo hace por si misma.
La
cuestion es que este error algunas veces pasa por alto, sobre todo en
maquinas gobernadas por un SO sin proteccion de memoria, caso de los
PC's con MS-DOS. En una maquina Unix tambien puede ocurrir si el valor
del puntero cae dentro de nuestro espacio de memoria, con lo que el
problema llega a ser muy grave y practicamente indetectable sin la
utilizacion del debugger.

Ejemplo:

main()
{
char *pchar;
int *pint;
*pchar='a';
printf("Direccion de 'a': %p",pchar);
pint=malloc(sizeof(int));
*pint=0;
/* Ahora lo apuntado por pchar puede haber cambiado de valor */
}

Seguramente una maquina Unix daria el error 'Segmentation fault' al ejecutar la primera linea de programa, pero nunca se sabe.
En cambio, una maquina MS-DOS se lo tragaria tal cual, y quizas provocaria la salida en pantalla del QEMM (si esta cargado).


Bibliografía

Cita de: Bibliografía
[Tienes que estar registrado y conectado para ver este vínculo].


Creditos

Cita de: Créditos
Pep Ciuraneta - [Tienes que estar registrado y conectado para ver este vínculo].es - Picateclas
Ignacio Gil - [Tienes que estar registrado y conectado para ver este vínculo].es - Soporte Grafico
Marcel Gras - [Tienes que estar registrado y conectado para ver este vínculo].es - Betatester
Joaquin Pertejo - [Tienes que estar registrado y conectado para ver este vínculo].es - Colaborador

shark0 - Recopilación en BBCode para foros.

_________________
[Tienes que estar registrado y conectado para ver esa imagen]
Volver arriba Ir abajo
Ver perfil de usuario http://www.moto-advance.com
ll.YONA.ll

Emblema
Emblema
avatar


Masculino
Mensajes : 1742
Edad : 28
Pais : Neuquen - villa la Angostura - Argentina.
Empleo/Ocio : estudiante
Registrado : 19/03/2009

MensajeTema: Re: [tutorial]punteros en C   Lun Mayo 24, 2010 7:30 pm

muy buen aporte amigo !! gracias
no lo crees
Invitado ??

_________________
ll.YONA.ll
[Tienes que estar registrado y conectado para ver esa imagen]

ll.YONA.ll Z1
Gana Dinero con
[Tienes que estar registrado y conectado para ver este vínculo]
Volver arriba Ir abajo
Ver perfil de usuario http://www.stylezrecords.com
Fran Villa

Web Master
Web Master
avatar


Masculino
Mensajes : 8121
Edad : 24
Pais : San Juan, Argentina
Empleo/Ocio : Estudiante
Registrado : 14/08/2008

MensajeTema: Re: [tutorial]punteros en C   Lun Mayo 24, 2010 10:58 pm

no entendi ni "J"

xD

buen post

_________________


[Tienes que estar registrado y conectado para ver esa imagen]

[Tienes que estar registrado y conectado para ver esa imagen]
FACE
BOOK

[Tienes que estar registrado y conectado para ver este vínculo]




Volver arriba Ir abajo
Ver perfil de usuario http://www.zona1.net
YonY

Ex-Moderador
Ex-Moderador
avatar


Masculino
Mensajes : 1270
Edad : 22
Pais : argentina
Empleo/Ocio : Estudiante/DJ/Jugador de Operation 7 Latino xD
Registrado : 04/08/2010

MensajeTema: Re: [tutorial]punteros en C   Lun Abr 25, 2011 8:13 pm

Jaja recién lo veo!!!
Muy buena información!!! Gracias
Haha YONA se lo creooo!!!Very Happy
Muchas palabras pero es interesante

_________________
[Tienes que estar registrado y conectado para ver este vínculo]
Volver arriba Ir abajo
Ver perfil de usuario http://www.4shared.com/account/dir/83w9wHBv/sharing.html?rnd=58
chinitopex

Administrador
Administrador
avatar


Masculino
Mensajes : 3831
Edad : 28
Pais : city----
Empleo/Ocio : English and Spanish
Registrado : 19/08/2008

MensajeTema: Re: [tutorial]punteros en C   Lun Abr 25, 2011 8:45 pm

CReo que solo es usar la logica este programa es muy completo
llevo 2 años estudiandolo y es lo mejor el visual basic es un pedo
no esta al alcanze del C++ se los recomiendo si quieren aprender
a programar verdaderamente usen este se los reocmiendo.. [Tienes que estar registrado y conectado para ver esa imagen]

_________________
[Tienes que estar registrado y conectado para ver esa imagen]


PoR + fUeRtE qUE sEaS, sIeMpRe ExIsTiRa OtRo +
PoDeRoSo QuE tU... Agradece mis aportes

Si te gustan mis aportes vota aqui eso nos ayudara
a seguir creciendo cada dia/ Gracias!!

[Tienes que estar registrado y conectado para ver este vínculo]
Volver arriba Ir abajo
Ver perfil de usuario
YonY

Ex-Moderador
Ex-Moderador
avatar


Masculino
Mensajes : 1270
Edad : 22
Pais : argentina
Empleo/Ocio : Estudiante/DJ/Jugador de Operation 7 Latino xD
Registrado : 04/08/2010

MensajeTema: Re: [tutorial]punteros en C   Mar Abr 26, 2011 7:38 pm

Recomendación aceptada Very Happy

_________________
[Tienes que estar registrado y conectado para ver este vínculo]
Volver arriba Ir abajo
Ver perfil de usuario http://www.4shared.com/account/dir/83w9wHBv/sharing.html?rnd=58
Contenido patrocinado





MensajeTema: Re: [tutorial]punteros en C   

Volver arriba Ir abajo
 

[tutorial]punteros en C

Ver el tema anterior Ver el tema siguiente Volver arriba 

 Temas similares

-
» [Tutorial] Moderar un tema antes de ser posteado
» como ver en pantalla completa tutorial "web en mi foro"
» Por que no ponen el tutorial de la cosa que pusieron en el indice
» [Tutorial] Pop-Ups
» [Tutorial] RSS
Página 1 de 1.

Permisos de este foro:No puedes responder a temas en este foro.
 :: Tecnología :: Software :: Programacion y Diseño de Software-