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

 

 


Tema destacado: Introducción a Git (Primera Parte)


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

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Consulta sobre punteros y doble punteros
« en: 17 Mayo 2019, 16:35 pm »

Tengo una consulta con el siguiente codigo:

Entiendo que cuando pongo char*Str=NULL lo que estoy declarando es un puntero cuyo contenido es NULL.
Lo que no entiendo es cuando str= CARGA().
No entiendo muy bien es  como funciona la siguiente linea "str=CARGA();".
Que es lo que hace esta funcion?.
Entiendo que hace que str= direccion de memoria del otro puntero.
Pero si estoy haciendo eso...no deberia poner *str=CARGA() para que el contenido de mi puntero str sea la direccion de esa memoria?.
Osea que es lo que se guarda en el contenido de STR? y porque con un simple %s sale la frase cuando deberia poner un asterisco?..

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. char*CARGA();
  4. void CARGA2(char**);
  5. int main()
  6. {
  7.    char *str=NULL;
  8.    str=CARGA();
  9.    CARGA2(&str);
  10.    printf("\n%s",str);
  11.    return 0;
  12. }
  13. char*CARGA()
  14. {
  15.    char*texto=NULL;
  16.    int i=0;
  17.    char letra;
  18.    texto=malloc(sizeof(char));
  19.    letra=getche();
  20.    while(letra!='\r')
  21.    {
  22.  
  23.        *(texto+i)=letra;
  24.        i++;
  25.        texto=realloc(texto,(i+1)*sizeof(char));
  26.        letra=getche();
  27.    }
  28.    *(texto+i)='\0';
  29.    return texto;
  30. }
  31.  


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Consulta sobre punteros y doble punteros
« Respuesta #1 en: 17 Mayo 2019, 16:46 pm »

Una cadena no devuelve su contenido sino su dirección de memoria. Pues eso mismo hace la función: regresa la dirección de memoria de la primera letra de la cadena. Como es una dirección de memoria lo debe adquirir el puntero (por tanto no se va a pasar su contenido).

printf ya sabe que con %s el parámetro va a ser una cadena e internamente va a hacer lo necesario para mostrarla. Pero otra vez a una cadena se le accede por medio de su dirección de memoria del primer elemento, no por su contenido, así que no necesita el *.


En línea

palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Re: Consulta sobre punteros y doble punteros
« Respuesta #2 en: 17 Mayo 2019, 17:07 pm »

Hay algo que no entiendo  en la parte de str=carga()...esa duda si que no la entiendo.
Supongamos que declaro mi puntero char =NULL como en la linea 7 es esta cajita.
Donde 150 es la direccion de memoria de mi puntero y NULL es su contenido.

 l NULL l
  ------
   150

En la linea 8 yo pongo que str=CARGA() y CARGA me va a devolver un puntero al texto que cargue.
Entonces segun lo que creo mi caja queda asi?

 l Direccion Memoria Del Texto (Primer posicion del texto) l
               --------------------------------
                   150


Entonces al hacer el %s detecta la primera posicion de la direccion de memoria del texto y me imprime el texto?.
En línea

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.397


Turn off the red ligth


Ver Perfil WWW
Re: Consulta sobre punteros y doble punteros
« Respuesta #3 en: 17 Mayo 2019, 18:49 pm »

Lo que almacenas en la direccion de memoria es un char, que ocupa 1byte.
No se te imprime el texto entero por arte de magia al tener la direccióm de memoria del primer char.

Digamos que tu texto es "hola" el puntero apunta a 0xff0033 en esa direccion de memoria esta la letra h
Entonces para imprimir la letra o, lo que se hace es una operación, direccion de memoria del puntero + 1byte es decir 0xff0033 + 8bits. Que vendria a ser 0xff003A. Como las cadenas de caracteres se guardan en direcciones de memoria contiguas, podemos imprimir todos los chars de la cadena con una operación sencilla. Sería algo así internamente:
Imprimir en pantalla el char dentro de la direccion de memoria a la que apunta el puntero, direccion de memoria del puntero + 8 bits, direccion de memoria del puntero + 16 bits, dirección de memoria del puntero +24 bits.
La dirección de puntero contiene h, la direccion del puntero + 8 bits contiene o, la direccion del puntero +16 bits contiene l, la dirección del pumtero + 24 bits contiene a.

Por si no te queda claro sería algo así:
Imprimir contenido de la dirección de memoria del puntero.
Imprimir contenido de la dirección de memoria +1byte del puntero
Imprimir contenido de la dirección de memoria +2bytes del puntero.
Imprimir contenido de la dirección de memoria+3bytes del puntero.

Como ves es el mismo puntero todo el rato. Con este unico puntero hacemos operaciones con la memoria a la que apunta para acceder al siguiente caracter.
El caracter está en binario, este caracter en binario se transforma en decimal. Y de decimal se transforma en letra. Busca en google tabla ascii y podras ver que valor decimal corresponde a cada letra/caracter. Ese valor al transformarse en binario ocupa los 8 bits.
Puedes incluso poner char miletra =valorDecimal; y se transformara en la letra correspondienteen la tabla ascii. Saber esto sirve para codificar en otras bases. Por ejemplo base64 que se usa mucho.
Busca en google como transformar un string a base64 y veras como tienes que transformar cada caracter en binario y una vez todos en binario se pillan los bits de 6 en 6 en vez de 8 en 8 para conseguir el string en base64.
Podrias hacer un programa que te convierta un texto a base64 para ver como funciona todo y recordarlo.

Recuerda que 1 byte es lo mismo que 8 bits. Estas operaciones podrías realizarlas tu manualmemte con un puntero apuntando al primer caracter de una cadena y sumarle los bits a la direccion de memoria para obtener todo el string con solo un puntero, no es nada complejo. Las funciones, metodos e incluso el compilador realizan muchas de estas tareas por nosotros para facilitarnos el codigo. Espero que me entendieses. Si no, pregunta.
« Última modificación: 17 Mayo 2019, 19:15 pm por string Manolo » En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Consulta sobre punteros y doble punteros
« Respuesta #4 en: 17 Mayo 2019, 20:40 pm »

Para que entiendas: NULL es lo mismo que 0, por tanto char *puntero = NULL es lo mismo que char *puntero = 0, es decir, puntero apuntará a la dirección 0 de memoria. C determina que la posición 0 (NULL) siempre será una posición no válida y saltará el error. Se usa por parte del programador para evitar que un puntero apunte a cualquier sitio y crear problemas de seguridad. Mejor que el programa muera a que te quedes sin dinero en el banco porque no has inicializado un puntero.

Las cadenas en C empiezan en una posición x de la memoria y son secuenciales, es decir, sus datos se encuentran en x+0, x+1, x+2, ... hasta que el dato de x+n valga '\0' (eso es 0), notar que he dicho el dato, el valor de la posición de memoria y no la posición de memoria en sí. Por tanto una función que trabaje con cadenas empezará dónde se le indique el puntero que devuelve la cadena y va recorriendo la memoria de forma secuencial hasta encontrar el carácter de fin de cadena, haciendo lo que deba hacer en cada carácter encontrado.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Consulta sobre punteros y referencias.
Programación C/C++
anonimo12121 5 2,875 Último mensaje 27 Febrero 2013, 05:10 am
por 85
problema con doble punteros
Programación C/C++
m@o_614 5 2,081 Último mensaje 30 Enero 2014, 18:20 pm
por rir3760
(Consulta) Punteros a punteros en C
Programación C/C++
class_OpenGL 1 1,782 Último mensaje 19 Julio 2016, 14:29 pm
por class_OpenGL
Consulta sobre punteros y memoria dinámica
Programación C/C++
ing_maipu 5 3,552 Último mensaje 18 Octubre 2017, 19:21 pm
por ing_maipu
Representación visual de punteros y punteros a punteros.. « 1 2 »
Programación C/C++
digimikeh 13 4,091 Último mensaje 4 Mayo 2019, 01:54 am
por RayR
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines