Cadenas de caracteres con punteros

Iniciado por pedroedlp, 11 Abril 2014, 04:19 AM

0 Miembros y 3 Visitantes están viendo este tema.

pedroedlp

Estoy estudiando C, y hasta ahora las cadenas de caracteres las venia creando asi:



char cadena[] = "Hola como te va";



pero ahora me encontre que tambien se puede hacer asi:



char* cadena = "Hola como te va";



y no entiendo porque funciona, osea por lo que entiendo los punteros son para aputar a direcciones de otras variables, pero en este caso lo estaria usando para guardar en el una cadena de texto, no entiendo porque funciona, porque crea en el un array.

rir3760

Cita de: pedroedlp en 11 Abril 2014, 04:19 AM
Estoy estudiando C, y hasta ahora las cadenas de caracteres las venia creando asi:
char cadena[] = "Hola como te va";
Esa sentencia declara al array "cadena" y sus elementos se inicializan con 'H', 'l', etc.

Cita de: pedroedlp en 11 Abril 2014, 04:19 AMpero ahora me encontre que tambien se puede hacer asi:
char *cadena = "Hola como te va";
y no entiendo porque funciona [...] en este caso lo estaria usando para guardar en el una cadena de texto
Funciona porque el valor inicial del puntero "cadena" es la dirección en memoria donde se almacena la cadena literal "Hola como te va". No se esta almacenando en el la cadena sino su dirección. Caso similar con el cartero: el no confunde la dirección en el sobre (un puntero) con el objeto que debe localizar (la casa).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

pedroedlp

Cita de: rir3760 en 11 Abril 2014, 05:44 AM
Esa sentencia declara al array "cadena" y sus elementos se inicializan con 'H', 'l', etc.
Funciona porque el valor inicial del puntero "cadena" es la dirección en memoria donde se almacena la cadena literal "Hola como te va". No se esta almacenando en el la cadena sino su dirección. Caso similar con el cartero: el no confunde la dirección en el sobre (un puntero) con el objeto que debe localizar (la casa).

Un saludo

pero si vos me decis que en ese puntero se almacena la direccion de la cadena "Hola como te va", porque cuando quiero imprimir la cadena no se pone el astarisco?



    char *cadena = "Hola como te va";
    printf("%s", cadena);



leosansan

Cita de: pedroedlp en 11 Abril 2014, 19:55 PM
pero si vos me decis que en ese puntero se almacena la direccion de la cadena "Hola como te va", porque cuando quiero imprimir la cadena no se pone el astarisco?



    char *cadena = "Hola como te va";
    printf("%s", cadena);




Porque el puntero apunta al primer caracter de la cadena, ni más ni menos. Otra cosa es la cadena entera.

Puedes comprobarlo con:


Código (cpp) [Seleccionar]
printf("%c", *cadena);

Citar
H

¿Ves como apunta al primer caracter?. Ya si quieres la cadena entera usas cadena sin el asterisco inicial y, como cadena que es, con el formato %s en el printf.

¡¡¡¡ Saluditos! ..... !!!!



rir3760

Cita de: pedroedlp en 11 Abril 2014, 19:55 PMpero si vos me decis que en ese puntero se almacena la direccion de la cadena "Hola como te va", porque cuando quiero imprimir la cadena no se pone el astarisco?
char *cadena = "Hola como te va";
printf("%s", cadena);
Porque cuando utilizas la función printf con el especificador "%s" esta espera la dirección en memoria (puntero) del objeto (array) cuyo contenido (cadena) debe procesar (imprimir).

En el lenguaje C los arrays no se pasan por valor, en su lugar se pasa su dirección en memoria.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language