una funcion entre diferencia declara constantes constante como c++ c

c++ - funcion - Cuándo usar const char*y cuándo usar const char



diferencia entre char y const char (6)

Ambos son claramente diferentes, para empezar:

  1. Primero crea un puntero.
  2. El segundo crea una matriz.

Siga leyendo para una explicación más detallada:

La versión de Array:

char text[] = "text";

Crea una matriz que es lo suficientemente grande como para contener la cadena literal "texto", incluido su terminador NULL . El text matriz se inicializa con la cadena literal "texto". La matriz puede ser modificada en un momento posterior . Además, el tamaño de la matriz se conoce incluso en tiempo de compilación, por lo que el operador sizeof se puede utilizar para determinar su tamaño.

La versión del puntero:

char *text = "text";

Crea un puntero para apuntar a un literal de cadena "texto". Esto es más rápido que la versión de matriz, pero la cadena apuntada por el puntero no debe cambiarse , ya que se encuentra en una memoria definida como implementación de solo lectura. La modificación de dicho literal de cadena da como resultado un comportamiento no definido .

De hecho, C ++ 03 desaprueba el uso del literal de cadena sin la palabra clave const . Entonces la declaración debería ser:

const char*text = "text";

Además, debe usar la función strlen() y no sizeof para encontrar el tamaño de la cadena, ya que el operador sizeof le dará el tamaño de la variable del puntero.

¿Qué versión es mejor?

Depende del uso.

  • Si no necesita realizar ningún cambio en la cadena, use la versión del puntero.
  • Si tiene la intención de cambiar los datos, use la versión de matriz.

EDITAR: Me acabo de informar (en comentarios) que el OP busca la diferencia entre:

const char text[] y const char* text

Bueno, los puntos diferentes anteriores siguen siendo válidos, excepto el relativo a la modificación del literal de la cadena. Con el calificador const la test matriz ahora es una matriz que contiene elementos del tipo const char que implica que no se pueden modificar.

Dado que, elegiría la versión de matriz sobre la versión de puntero porque el puntero puede ser (por error) fácilmente vuelto a sentar a otro puntero y la cadena podría modificarse a través de ese otro puntero dando como resultado un UB.

Sé que son diferentes, sé cómo son diferentes y leo todas las preguntas que pude encontrar sobre char* vs char[]

Pero todas esas respuestas nunca dicen cuándo deberían usarse.

Entonces mi pregunta es:

Cuando usas

const char *text = "text";

y cuando usas

const char text[] = "text";

¿Hay alguna directriz o regla?

Como ejemplo, cuál es mejor:

void withPointer() { const char *sz = "hello"; std::cout << sz << std::endl; } void withArray() { const char sz[] = "hello"; std::cout << sz << std::endl; }

(Sé que std::string también es una opción, pero específicamente quiero saber sobre char puntero / matriz)


En general, para responder este tipo de preguntas, use la que sea más explícita .

En este caso, const char[] gana porque contiene información más detallada sobre los datos dentro, es decir, el tamaño del búfer.


Me ayudaron mucho las entradas de blog de Ulrich Drepper hace un par de años:

muy cerca, pero no hay cigarros y más variedad de diversión

La esencia del blog es que se prefiera const char[] pero solo como variable global o estática.

Usar un puntero const char* tiene como desventajas:

  1. Una variable adicional
  2. puntero es escribible
  3. una indirección adicional
  4. el acceso a la cadena a través del puntero requiere 2 cargas de memoria

Probablemente la mayor diferencia es que no puede usar el operador sizeof con el puntero para comenzar a señalar el tamaño del búfer, donde, como en la versión const char[] , puede usar sizeof en la variable de matriz para obtener el tamaño de la huella de memoria de la matriz en bytes. Entonces realmente depende de lo que quieras hacer con el puntero o el búfer, y cómo quieres usarlo.

Por ejemplo, hacer:

void withPointer() { const char *sz = "hello"; std::cout << sizeof(sz) << std::endl; } void withArray() { const char sz[] = "hello"; std::cout << sizeof(sz) << std::endl; }

te dará respuestas muy diferentes.


Si usa una matriz, entonces los datos se inicializan en tiempo de ejecución. Si usa el puntero, la sobrecarga de tiempo de ejecución es (probablemente) menor porque solo se debe inicializar el puntero. (Si los datos son más pequeños que el tamaño de un puntero, la inicialización del tiempo de ejecución de los datos es menor que la inicialización del puntero). Por lo tanto, si tiene suficientes datos que importan y le importa el tiempo de ejecución costo de la inicialización, debe usar un puntero. Casi nunca deberías preocuparte por esos detalles.


Solo una nota:

Lo haría static const char sz[] = "hello"; . Declarar como tal tiene la agradable ventaja de hacer cambios en esa cadena constante para bloquear el programa al escribir en la memoria de solo lectura. Sin static , la pérdida de la constness y luego cambiar el contenido puede pasar desapercibida.

Además, la static permite que la matriz simplemente mienta en la sección de datos constantes en lugar de crearse en la pila y copiarse de la sección de datos constantes cada vez que se llama a la función.