Esta puede ser una pregunta simple, pero ¿por qué un const char * no necesita una dirección de memoria para señalar?
Ejemplo:
const char* a = "Anthony";
y no:
const char *a = // Address to const char
como cualquier otro tipo de hacer?
Esta puede ser una pregunta simple, pero ¿por qué un const char * no necesita una dirección de memoria para señalar?
Ejemplo:
const char* a = "Anthony";
y no:
const char *a = // Address to const char
como cualquier otro tipo de hacer?
Respuestas:
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 designadores de matriz a punteros a sus primeros caracteres) se asigna al 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 de terminación cero ' \0'
.
En el programa demostrativo la expresión
std::extent<std::remove_reference<decltype( r )>::type>::value
puede ser sustituido solo por la expresión
sizeof( r )
¿Por qué un const char no necesita una dirección de memoria para señalar? *
Lo hace.
Un literal C-string como
"Anthony"
se descompone a la dirección de su 1er carácter. Me gusta, por cierto; cualquier matriz en C lo hace.
const char[8]
(en C ++, podría estar char [8]
en C, no estoy seguro) y, al igual que todas las matrices integradas, cuando se usa como un valor se desintegra en un puntero a su primer elemento.
char [8]
en C: c-faq.com/ansi/strlitnotconst.html
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 array [] = {0, 1, 2, 3};".
Si usaras un editor binario para mirar el ejecutable, verías 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.
"¿Por
const char*
qué no necesita un puntero a una dirección de memoria?"
De hecho, se hace necesario una dirección de memoria a punto de hacerlo.
const char* a
significa a
es un puntero a una cadena literal o constante de caracteres.
Un puntero siempre requiere una dirección para apuntar porque es la naturaleza de un puntero apuntar a un objeto específico en la memoria. Entonces, a
y cualquier otro puntero const char
también lo hace.
Una cadena literal 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 de la cadena literal.
Significa, a su vez, que a
se asigna por 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 correspondiente de manera apropiada.