¿Es mejor tabla de caracteres que cadena literal?:O

Iniciado por vangodp, 27 Abril 2014, 10:57 AM

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

vangodp

A ver chicos :D
Necesito esclarecer una dudita.
En el libro de deitel sobre las cadenas de caracteres tal y tal dice que es mejor una tabla o arreglo de char que una cadena literal.
A ver me explico por si las moscas:
una cadena literal es esto:

char tabla[]="sopita";

y una tabla de chars es esto:

char tabla2[] = {'s','o','p','i','t','a','\0'};

Pensaba que era lo mismo  :huh:  :o

Dice que si hago como cadena literal puede que el sistema la almecene en un lugar de la memoria que no me deje cambiar y que de la otra forma garantizo la posibilidad de cambio en un futuro.
Gracias de antemano  ;-)

c tiene mas gato encerrado que el copón XDD hay que estar atento a muchas cosas.

amchacon

Para nada, ambas sintaxis son correctas.

Creo que confundes con:

char* tabla = "sopita";

Esa si que no la puedes cambiar.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

vangodp

#2
cadena literal:
char color [ ] = " azul " ;
const char *ptrColor = "azul" ;

en el libro pone que estos casos de arriba no son el mismo que este:

tabla de chars:
char color [ ] = { 'a','z','u', 'l', '\0' } ;

puedo equivocarme pero si dudas haré una captura XDDD

sus palabras exactas son:

"Cuando se inicializa una variable de tipo char* con una literal de cadena, es posible que algunos compiladores
coloquen la cadena en un lugar de la memoria, en donde ésta no se pueda modificar: Si necesitara modificar una literal de cadena, podría almacenarla en un arreglo de caracteres para garantizar que pueda modificarla en cualquier
sistema."


ademas es un tip de portabilidad del libro

amchacon

Tú mismo lo has dicho, un tipo char*

Pero en los ejemplos que pones en el primer post son del tipo char[]
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

vangodp

#4
pero a ver un char[] no es lo mismo que un char* :S

digo por que algo se me escapa.

Si declaro:

char letra[] = "una cadena";

char *letra = "una cadena";

no son ambos punteros a la posición 0 de la cadena.   :huh:

que relacion tienenlas 3 formas.
char color [ ] = " azul ";                     //declaro una tabla y guardo "azul"
const char *ptrColor = "azul" ;           //declado un puntero a "azul" ¿creo que apunta a la posicion 0?
char color [ ] = { 'a','z','u', 'l', '\0' } ;  // y esto queo que es lo mismo que char color [ ] = " azul ";, o me equivoco... vaya lio XDD


amchacon

A la hora de declararlo, no.

Te lo explico brevemente. Cuando tu pones:
Código (cpp) [Seleccionar]
char texto[5] = "Hola";

Eso es la declaración de un array. Para facilitar la sintaxis el compilador te permite escribir eso, internamente lo traduce como:
Código (cpp) [Seleccionar]
char texto[5] = {'H','o','l','a','\0'};

En cuanto al char*, cuando tu pones:
Código (cpp) [Seleccionar]
char* texto = "Hola";

Estas declarando un puntero (que no un array) que apunta a la cadena "Hola". Esa cadena suele ser un array constante que el compilador crea sobre la marcha.

Si intentas modificar el contenido de un array constante, el resultado es indefinido. Lo que si puedes hacer esque el puntero apunte a otra cadena:
Código (cpp) [Seleccionar]
char* texto = "Hola";

/...

texto = "Nuevo texto";
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

vangodp

Eso es una explicación de 1º  ;-)
Ahora si lo he pillao -_-'
Muchísimas gracias  ;D
no estaba enterandome de lo de char*ptr = "hola";
O sea que es constante y por eso no se puede cambiar hmmmm
¡Eres un artista!