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

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


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

Desconectado Desconectado

Mensajes: 70


Ver Perfil
Ayuda con punteros en C
« en: 25 Agosto 2015, 14:07 pm »

Hola a tod@s, como sabeis estoy aprendiendo C, ya se lo básico pero me he puesto a aprender punteros y estoy hecho un lio, no son pocas las veces que he intentado aprender punteros en C y no lo asimilo ni por a ni por b.

Lo básico de punteros más o menos lo se, se que los punteros se declaran con:

Código
  1. tipo *var;

ej:

Código
  1. int *p;

El caracter & delante de una variable se usa para hayar la dirección de memoria de dicha variable, para después, guardarla en un puntero, ej:

Código
  1. int *p;
  2. int a=5;
  3. p=&a;

Y también se que el caracter * sirve para hayar el valor de lo que apunta un puntero, por ejemplo
Código
  1. int *p;
  2. int a=5;
  3. p=&a;
  4. int b=*p;
  5. printf("el valor de b es: %d\n", b);

Hasta ahí llego, el problema lo tengo en cosas más avanzadas, como cuando leo la relación que hay entre punteros y arrays, no acabo de entenderlo, por ejemplo he escuchado que un array es un puntero pero ya digo no me queda del todo claro como manejarlos.

Por ejemplo, no veo la diferencia entre un

Código
  1. char nombre[10];

de un:

Código
  1. char *nombre;

¿Es lo mismo?

También, si me pudieran explicar un poco los punteros (quitando lo básico que he puesto arriba que se) se lo agradecería muchísimo.

Saludos.


« Última modificación: 25 Agosto 2015, 18:12 pm por snake_linux » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Ayuda con punteros en C
« Respuesta #1 en: 25 Agosto 2015, 14:14 pm »

Un array es un puntero. La diferencia es, que en evz de apuntar a 1 variable, apunta a un conjunto de variables, una delante de otra (en memoria).

Código
  1. char nombre[10];
  2. char *nombre;

¿Es lo mismo?

No, no lo es. El primero tiene 10 chars de memoria. El segundo, solo es un puntero.
A nivel práctico sí, ambos son punteros. Pero para utilizar el segundo como puntero, tienes que reservarle memoria:

Código
  1. char *nombre;
  2. nombre = (char*) malloc(sizeof(char) * 10);
Con eso, igualamos el puntero a una dirección de memoria que contiene 10 char.

Para acceder a cada uno, utilizas el operador []:
Código
  1. nombre[5] = 'C';

Si utilizas malloc para reservar memoria, luego tienes que liberarla:
Código
  1. free(nombre);


En línea

snake_linux

Desconectado Desconectado

Mensajes: 70


Ver Perfil
Re: Ayuda con punteros en C
« Respuesta #2 en: 25 Agosto 2015, 15:25 pm »

Un array es un puntero. La diferencia es, que en evz de apuntar a 1 variable, apunta a un conjunto de variables, una delante de otra (en memoria).

No, no lo es. El primero tiene 10 chars de memoria. El segundo, solo es un puntero.
A nivel práctico sí, ambos son punteros. Pero para utilizar el segundo como puntero, tienes que reservarle memoria:

Código
  1. char *nombre;
  2. nombre = (char*) malloc(sizeof(char) * 10);
Con eso, igualamos el puntero a una dirección de memoria que contiene 10 char.

Para acceder a cada uno, utilizas el operador []:
Código
  1. nombre[5] = 'C';

Si utilizas malloc para reservar memoria, luego tienes que liberarla:
Código
  1. free(nombre);

Entonces, una vez que has reservado la memoria necesaria para el char *, la única diferencia entré eso y crear un array de la manera clásica de char nombre[valor] es que la primera forma, se hace con memoria dinámica, por lo que puedo liberar ese espacio cuando quiera y además puedo incluso (por lo que he leido investigando) redimensionarlo sin perder los datos que tenía. ¿ Es así ?.

Aparte de lo que he puesto que se en el post, y junto con esto, ¿ No hay nada más sobre punteros ? Es que estoy investigando por internet de allí y allá y como veo la info "a cachos" no me entero.

Saludos y gracias.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Ayuda con punteros en C
« Respuesta #3 en: 25 Agosto 2015, 15:45 pm »

Los punteros realmente, solo es eso, un apuntador a una dirección de memoria. Luego los usas como veas.

Pero sí, en general, pasar variables por referencia, arrays y matrices.

Lo único eso, una matriz:
Código
  1. int **matriz;
  2. matriz = (int**) malloc(sizeof(int*) * 10);
  3. int i;
  4. for(i=0; i<10; i++)
  5.    matriz[i] = (int*) malloc(sizeof(int) * 10);
  6.  
  7. matriz[1][8] = 66;

Así obtendrías una matriz de 10x10 dinámica. Realmente es lo mismo que un array, pero jugando con tipos. Ya ahí usas los punteros como quieras.

Código
  1. int *****matriz;
Disfruta rellenándolo con una matriz de 5 dimensiones xD
En línea

snake_linux

Desconectado Desconectado

Mensajes: 70


Ver Perfil
Re: Ayuda con punteros en C
« Respuesta #4 en: 25 Agosto 2015, 16:54 pm »

Los punteros realmente, solo es eso, un apuntador a una dirección de memoria. Luego los usas como veas.

Pero sí, en general, pasar variables por referencia, arrays y matrices.

Lo único eso, una matriz:
Código
  1. int **matriz;
  2. matriz = (int**) malloc(sizeof(int*) * 10);
  3. int i;
  4. for(i=0; i<10; i++)
  5.    matriz[i] = (int*) malloc(sizeof(int) * 10);
  6.  
  7. matriz[1][8] = 66;

Así obtendrías una matriz de 10x10 dinámica. Realmente es lo mismo que un array, pero jugando con tipos. Ya ahí usas los punteros como quieras.

Código
  1. int *****matriz;
Disfruta rellenándolo con una matriz de 5 dimensiones xD

No me ha quedado claro el código que me has puesto, si con la segunda linea ya reservas espacio para una matriz, ¿ Para que es ese for ?.

Gracas.

Saludos.
En línea

kr.chacacreker

Desconectado Desconectado

Mensajes: 19



Ver Perfil
Re: Ayuda con punteros en C
« Respuesta #5 en: 25 Agosto 2015, 17:18 pm »

No me ha quedado claro el código que me has puesto, si con la segunda linea ya reservas espacio para una matriz, ¿ Para que es ese for ?.

Gracias.

Saludos.
Fijate
Código
  1. matriz = (int**) malloc(sizeof(int*) * 10);
lo que hace es reservar 10 punteros,el (int**) es un cast, una "conversión". Luego en
Código
  1. int i;
  2. for(i=0; i<10; i++)
  3.    matriz[i] = (int*) malloc(sizeof(int) * 10);
  4.  
para cada puntero reservado reserva 1 entero.

Eso jodido para quien no ha visto algo de ingeniería inversa ya que lo ves de otro modo, te recomiendo que pases un poco por los tutes de Introducción al ollydbg de ricardo narvaja, No explica punteros pero te das cuenta de algunas cosas por ej: que cada byte de memoria es apuntado por una dirección de memoria.
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Ayuda con punteros en C
« Respuesta #6 en: 25 Agosto 2015, 18:08 pm »

Una matriz, no es más que un puntero que apunta a un array de punteros.
Así que una vez reservada memoria para el array de punteros, hay que reservar memoria para cada puntero. Eso lo haces con el for.
En línea

snake_linux

Desconectado Desconectado

Mensajes: 70


Ver Perfil
Re: Ayuda con punteros en C
« Respuesta #7 en: 25 Agosto 2015, 18:12 pm »

Una matriz, no es más que un puntero que apunta a un array de punteros.
Así que una vez reservada memoria para el array de punteros, hay que reservar memoria para cada puntero. Eso lo haces con el for.

Gracias por la aclaración, ya me has resuelto la duda, gracias :)
En línea

Mientras

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: Ayuda con punteros en C
« Respuesta #8 en: 26 Agosto 2015, 00:17 am »

Bueno, yo no soy de usar **, ya que no lo manejo muy bien  :-[

Como se almacena en memoria un array bidimensional ?. En uno unidimensional sé que es secuencial, y que puedo acceder mediante *(p) , *(p+1) ....




« Última modificación: 26 Agosto 2015, 01:26 am por Mientras » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Ayuda con punteros en C
« Respuesta #9 en: 26 Agosto 2015, 01:15 am »

Hay algo que no he comentado.

Los punteros son como se ha dicho, todo bien.

PERO:
Código
  1. int a[5][5];
  2. int b[10];

NO se guardan en memoria de la misma manera. Esas variables se guardan en la pila, mientras que las variables llamadas con "malloc()" se almacenan en el "heap". Además, la organización de los datos no es el mismo.

Pero bueno, simplemente saber que cuando creas "int a[5][6]" no es igual que "int **a".
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Ayuda]con punteros en asm
ASM
ny0x 4 6,756 Último mensaje 12 Mayo 2009, 21:45 pm
por ny0x
Ayuda punteros. [c++]
Programación C/C++
ninto33 3 3,809 Último mensaje 19 Enero 2011, 01:46 am
por ninto33
Duda Punteros Dobles/Array de punteros
Programación C/C++
MisterJava 2 4,911 Último mensaje 30 Diciembre 2012, 20:19 pm
por MisterJava
ayuda con punteros de C
Programación C/C++
LeoJ24 1 1,715 Último mensaje 11 Enero 2013, 18:13 pm
por durasno
Ayuda con punteros (en C++) (Actualizacion constante con nuevas preguntas)
Programación C/C++
DarkSorcerer 5 2,330 Último mensaje 18 Septiembre 2013, 07:12 am
por eferion
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines