Autor
|
Tema: ¿Es mejor tabla de caracteres que cadena literal?:O (Leído 2,317 veces)
|
vangodp
Desconectado
Mensajes: 455
|
A ver chicos 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 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.
|
|
« Última modificación: 27 Abril 2014, 12:49 pm por vangodp »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Para nada, ambas sintaxis son correctas.
Creo que confundes con:
char* tabla = "sopita";
Esa si que no la puedes cambiar.
|
|
|
En línea
|
|
|
|
vangodp
Desconectado
Mensajes: 455
|
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
|
|
« Última modificación: 27 Abril 2014, 11:45 am por vangodp »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
Tú mismo lo has dicho, un tipo char*
Pero en los ejemplos que pones en el primer post son del tipo char[]
|
|
|
En línea
|
|
|
|
vangodp
Desconectado
Mensajes: 455
|
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. 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
|
|
« Última modificación: 27 Abril 2014, 12:59 pm por vangodp »
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
A la hora de declararlo, no. Te lo explico brevemente. Cuando tu pones: 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: char texto[5] = {'H','o','l','a','\0'};
En cuanto al char*, cuando tu pones: 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: char* texto = "Hola"; /... texto = "Nuevo texto";
|
|
|
En línea
|
|
|
|
vangodp
Desconectado
Mensajes: 455
|
Eso es una explicación de 1º Ahora si lo he pillao -_-' Muchísimas gracias 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!
|
|
|
En línea
|
|
|
|
|
|