Esta puede ser una pregunta simple, pero ¿por qué un const char* no necesita una dirección de memoria a la que apuntar?
Ejemplo:
const char* a = "Anthony";y no:
const char *a = // Address to const charcomo cualquier otro tipo?
¿Por qué un const char no necesita una dirección de memoria a la que apuntar?*
Lo hace.
Un literal de cadena C como
"Anthony"se decae a la dirección de su 1º carácter. Como, por cierto; cualquier matriz en C lo hace.
Puedes imaginar esta declaración.
const char* a = "Anthony";de la siguiente manera
const char string_literal[] = "Anthony"; const char *a = string_literal; Es decir, el compilador crea una matriz de caracteres con la duración de almacenamiento estático que almacena la cadena "Anthony" y la dirección del primer carácter de la matriz (debido a la conversión implícita de los designadores de matriz en punteros a sus primeros caracteres) se asigna a el puntero a .
Aquí hay un programa demostrativo que muestra que los literales de cadena son matrices de caracteres.
#include <iostream> #include <type_traits> decltype( auto ) f() { return ( "Anthony" ); } template <size_t N> void g( const char ( &s )[N] ) { std::cout << s << '\n'; } int main() { decltype( auto ) r = f(); std::cout << "The size of the referenced array is " << std::extent<std::remove_reference<decltype( r )>::type>::value << '\n'; g( r ); return 0; }La salida del programa es
The size of the referenced array is 8 Anthony El tamaño del literal de cadena (de la matriz que almacena el literal de cadena) es igual a 8 porque la cadena incluye también el carácter cero de terminación ' \0' .
En el programa demostrativo la expresión
std::extent<std::remove_reference<decltype( r )>::type>::valuepuede sustituirse solo por la expresión
sizeof( r )"¿Por qué
const char*no necesita un puntero a una dirección de memoria?"
De hecho, necesita una dirección de memoria a la que apuntar.
const char* a significa que a es un puntero a un literal de cadena o una constante de carácter.
Un puntero siempre requiere una dirección a la que apuntar porque es la naturaleza de un puntero apuntar a un objeto específico en la memoria. Entonces, a y cualquier otro puntero a const char también lo hacen.
Un literal de cadena como "Hi My Name is Alfred!" por una tarea como:
const char* a; a = "Hi My Name is Alfred!";decae a un puntero a la dirección del primer elemento del literal de cadena.
Significa, a su vez, que se asigna a la dirección del primer elemento del literal de cadena "Hi My Name is Alfred!" que podría almacenarse en cualquier lugar de la memoria dependiendo del entorno de ejecución.
No está en el poder de un programador donde un literal de cadena se almacena exactamente. Su tarea es solo asignar y manejar el puntero respectivo de manera apropiada.
Necesita una dirección de memoria y TIENE una dirección de memoria. En su ejemplo, es simplemente la dirección de memoria del comienzo de la cadena. Es lo mismo con cualquier otra variable de matriz que se inicializa en tiempo de compilación, por ejemplo, "int matriz [] = {0, 1, 2, 3};".
Si usó un editor binario para mirar el ejecutable, vería la cadena "Anthony" allí. Si coloca la línea "printf ("a está en %p\n", (void *)a);" en su programa, luego compílelo y ejecútelo, verá la dirección.