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?
c++
c
implicit-conversion
c-strings
string-literals
Weidelix
fuente
fuente
Respuestas:
Puedes imaginar esta declaración
de la siguiente manera
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 punteroa
.Aquí hay un programa demostrativo que muestra que los literales de cadena son matrices de caracteres.
La salida del programa es
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
puede ser sustituido solo por la expresión
fuente
Lo hace.
Un literal C-string como
se descompone a la dirección de su 1er carácter. Me gusta, por cierto; cualquier matriz en C lo hace.
fuente
const char[8]
(en C ++, podría estarchar [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.htmlNecesita 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.
fuente
De hecho, se hace necesario una dirección de memoria a punto de hacerlo.
const char* a
significaa
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 punteroconst char
también lo hace.Una cadena literal como
"Hi My Name is Alfred!"
por una tarea como: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.
fuente