¿Pregunta puntero a char en c++?

Iniciado por Zodiak98, 21 Abril 2013, 23:57 PM

0 Miembros y 1 Visitante están viendo este tema.

Zodiak98

Hola bueno tengo una duda por ejemplo una variable de tipo char almacena 1 solo dato pero en un ejemplo vi un código en el cual hay un puntero de tipo char asi:

char* nombre = "Yahoo";

Qué según tengo entendido es para que la variable de tipo char almacene ma sde 1 dato, pero ahora aquí vamos a mi duda porqué se coloca el simbolo de indirección(*) porque mejor no hacerlo con un array? O es qué al colocar ese puntero esa variable se convierte en un array? Expliquenme detalladamente por favor...

amchacon

Los char* son la excepción a los punteros. Por ayuda sintactica se permite:
char nombre[] = "Yahoo";
char* nombre = "Yahoo";


Ambos significan lo mismo. De hecho un array no es más que un puntero a su primer elemento.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

Zodiak98

Cita de: amchacon en 22 Abril 2013, 00:23 AM
Los char* son la excepción a los punteros. Por ayuda sintactica se permite:
char nombre[] = "Yahoo";
char* nombre = "Yahoo";


Ambos significan lo mismo. De hecho un array no es más que un puntero a su primer elemento.

Hehe grax me aclaraste la duda pero una cosa pero podrias explicarme este concepto:
Citar
De hecho un array no es más que un puntero a su primer elemento.

La verdad soy nuevo, perdona mi ignorancia. D:

Sí se que es un arreglo, pero no entendi ese concepto podrias explicarmelo? :)

Si puedes un ejemplo tmb. :)

durasno

Tal vez: El nombre del array no es mas que un puntero que apunta al primer elemento xD. Al ser un puntero se lo puede tratar como tal, por ejemplo:

char arrNombre[]="Yahoo";

printf("%c\n",arrNombre[i]); /* imprime un caracter usando subindices */


printf("%c\n",*(arrNombre+i)); /* imprime un caracter usando aritmetica de punteros */


Saludos

PD: en el proceso de compilacion se traduce arrNombre en *(arrNombre+i)

PD:
Citarsegún tengo entendido es para que la variable de tipo char almacene ma sde 1 dato
la palabra no seria almacenar sino apuntar, ya que en el caso del char * lo que hace nombre es apuntar a la direccion donde se encuentra la palabra "Yahoo"
Ahorrate una pregunta, lee el man

Zodiak98

Cita de: durasno en 22 Abril 2013, 02:40 AM
Tal vez: El nombre del array no es mas que un puntero que apunta al primer elemento xD. Al ser un puntero se lo puede tratar como tal, por ejemplo:

char arrNombre[]="Yahoo";

printf("%c\n",arrNombre[i]); /* imprime un caracter usando subindices */


printf("%c\n",*(arrNombre+i)); /* imprime un caracter usando aritmetica de punteros */


Saludos

PD: en el proceso de compilacion se traduce arrNombre en *(arrNombre+i)

PD: la palabra no seria almacenar sino apuntar, ya que en el caso del char * lo que hace nombre es apuntar a la direccion donde se encuentra la palabra "Yahoo"

Wey disculpa mi ignorancia pero no te entendi lo que quiero saber es porque un arreglo no es mas que un puntero que apunta a su primer elemento. osea por ejemplo:

char foro[] = "ElHacker.Net";

Osea que foro[] es un puntero hacia E? y E Apunta hacia los demas caracteres.??

No entiendo solo quiero saber eso.

amchacon

Cita de: Zodiak98 en 22 Abril 2013, 23:03 PMy E Apunta hacia los demas caracteres.??
No, los demás caracteres están consecutivos en la memoria. De modo que solo tiene que ir avanzando.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

SARGE553413

Saludos.

Un array es un puntero al primer elemento de éste, como dices en tu ejemplo, efectivamente apunta a la letra 'E'. De hecho te invito a que pruebes esto:

char c[]="Puntero";
cout<<*c<<endl;
cout<<*(c+(1*sizeof(char)))<<endl;


Comprobarás que sale por pantalla la letra 'P' y luego la 'u'.

Pero un array tiene la salvedad de que está indexado, es decir, podemos acceder a sus componentes sin pasar primero por todas las anteriores (por ej. v[5] --> accedo directamente a la 6ª componente), cosa que por ej. una lista enlazada de nodos, no.
No estoy seguro, pero al acceder a los índices del array en cuestión, me imagino que tomará el puntero al primer elemento y le sumara n*sizeof(<tipo_array>), tal como he hecho en mi ejemplo.

Saludos.

Zodiak98

Cita de: SARGE553413 en 22 Abril 2013, 23:39 PM
Saludos.

Un array es un puntero al primer elemento de éste, como dices en tu ejemplo, efectivamente apunta a la letra 'E'. De hecho te invito a que pruebes esto:

char c[]="Puntero";
cout<<*c<<endl;
cout<<*(c+(1*sizeof(char)))<<endl;


Comprobarás que sale por pantalla la letra 'P' y luego la 'u'.

Pero un array tiene la salvedad de que está indexado, es decir, podemos acceder a sus componentes sin pasar primero por todas las anteriores (por ej. v[5] --> accedo directamente a la 6ª componente), cosa que por ej. una lista enlazada de nodos, no.
No estoy seguro, pero al acceder a los índices del array en cuestión, me imagino que tomará el puntero al primer elemento y le sumara n*sizeof(<tipo_array>), tal como he hecho en mi ejemplo.

Saludos.

Orale amigo gracias alfín entiendo xDD Bueno osea que esto:

Citar
     char c[]="Puntero";
    cout<<*c<<endl;
    cout<<*(c+(1*sizeof(char)))<<endl;

y esto:
Citar
     char c[]="Puntero";
     cout << c[0] << endl;
    cout << c[1] << endl; 

Es exactamente lo mismo, o existe alguna diferencia? :) A mi parecer es exactamente lo mismo. Pero claro soy un novato xD


amchacon

Es exactamente lo mismo.

De hecho [] es un operador de punteri E_E
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

x64core

Aclarar que estas declaraciones no equivalen exactamente lo mismo:

char nombre[] = "Yahoo";
char* nombre = "Yahoo";

El primero Declara un array de char´s y copia la cadena "Yahoo" al array.
El segundo es de un puntero a la cadena por lo tanto lo unico que se copia el la dirección de la cadena.