Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Zodiak98 en 21 Abril 2013, 23:57 pm



Título: ¿Pregunta puntero a char en c++?
Publicado por: Zodiak98 en 21 Abril 2013, 23:57 pm
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...


Título: Re: ¿Pregunta puntero a char en c++?
Publicado por: amchacon en 22 Abril 2013, 00:23 am
Los char* son la excepción a los punteros. Por ayuda sintactica se permite:
Código
  1. char nombre[] = "Yahoo";
  2. char* nombre = "Yahoo";

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


Título: Re: ¿Pregunta puntero a char en c++?
Publicado por: Zodiak98 en 22 Abril 2013, 01:12 am
Los char* son la excepción a los punteros. Por ayuda sintactica se permite:
Código
  1. char nombre[] = "Yahoo";
  2. 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. :)


Título: Re: ¿Pregunta puntero a char en c++?
Publicado por: 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:

Código
  1. char arrNombre[]="Yahoo";
  2.  
  3. 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:
Citar
segú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"


Título: Re: ¿Pregunta puntero a char en c++?
Publicado por: Zodiak98 en 22 Abril 2013, 23:03 pm
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:

Código
  1. char arrNombre[]="Yahoo";
  2.  
  3. 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.


Título: Re: ¿Pregunta puntero a char en c++?
Publicado por: amchacon en 22 Abril 2013, 23:32 pm
y 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.


Título: Re: ¿Pregunta puntero a char en c++?
Publicado por: 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:
Código:
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.


Título: Re: ¿Pregunta puntero a char en c++?
Publicado por: Zodiak98 en 23 Abril 2013, 04:01 am
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:
Código:
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



Título: Re: ¿Pregunta puntero a char en c++?
Publicado por: amchacon en 23 Abril 2013, 08:19 am
Es exactamente lo mismo.

De hecho [] es un operador de punteri E_E


Título: Re: ¿Pregunta puntero a char en c++?
Publicado por: x64core en 23 Abril 2013, 09:53 am
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.


Título: Re: ¿Pregunta puntero a char en c++?
Publicado por: amchacon en 23 Abril 2013, 10:35 am
Ambas sentencias son equivalentes puesto que tienen el mismo uso de memoria y se usan igual.

Además cómo ya hemos dicho,  un array no es más que un puntero a su primer elemento.


Título: Re: ¿Pregunta puntero a char en c++?
Publicado por: rir3760 en 23 Abril 2013, 17:01 pm
tengo una duda por ejemplo una variable de tipo char almacena 1 solo dato
Correcto. Si deseas almacenar mas no hay otra opción que utilizar un array.

pero en un ejemplo vi un código en el cual hay un puntero de tipo char asi:
Código
  1. char* nombre = "Yahoo";
Qué según tengo entendido es para que la variable de tipo char almacene ma sde 1 dato
No. Una variable de tipo "puntero a T" solo puede almacenar la dirección de un objeto, lo que almacene el objeto apuntado es otra historia.

pero ahora aquí vamos a mi duda porqué se coloca el simbolo de indirección(*)
Porque es una declaración y en ella la única forma de indicar que la variable es un puntero es mediante el carácter '*', no hay '*' entonces no hay puntero:
Código
  1. int numero; /* variable de tipo "int" */
  2. int *p;     /* variable de tipo "puntero a int" */

----

Ambas sentencias son equivalentes puesto que tienen el mismo uso de memoria y se usan igual.
No. Ya lo indicaron durasno y x64Core, solo voy a explicarlo un poco mas.

Cuando se declara un array puede utilizarse como valor inicial una cadena literal pero esta es equivalente a una lista de valores. Siguiendo tu ejemplo:
Código
  1. /* Esta declaracion ... */
  2. char nombre[] = "Yahoo";
  3.  
  4. /* ... se termina procesando de esta forma */
  5. char nombre[] = {'Y', 'a', 'h', 'o', 'o', '\0'};

Otra historia es la declaración de un puntero inicializando este mediante una literal:
Código
  1. char* nombre = "Yahoo";
Aquí la cadena literal "Yahoo" es de tipo array de caracteres, se almacena en alguna dirección en memoria y es esa dirección el valor inicial del puntero.

Además cómo ya hemos dicho,  un array no es más que un puntero a su primer elemento.
No. Los arrays y punteros son objetos distintos.

El detalle (o problema, depende de la perspectiva) es: denotar (referirse a) un array mediante su nombre o una expresión resulta (salvo contados casos) en la dirección del primer elemento del array.

El caso mas conocido es el uso de scanf, cuando se trata con esta de leer una palabra utilizamos el nombre de un array sin el operador '&':
Código
  1. char nombre[100];
  2. char (*p)[100] = &nombre;
  3.  
  4. /* Para indicar que array usar utilizamos: */
  5.  
  6. puts("Teclea tu nombre:");
  7. scanf("%s", nombre /* 1) Su nombre */);
  8.  
  9. puts("Teclea tu nombre:");
  10. scanf("%s", *p /* 2) Una expresion */);

Uno de los pocos casos donde ello no aplica es el uso del operador sizeof, si su argumento es un array declarado en el mismo ámbito este reportara correctamente el tamaño del array.

Un saludo