Essa pode ser uma pergunta simples, mas por que um const char * não precisa de um endereço de memória para apontar?
Exemplo:
const char* a = "Anthony";
e não:
const char *a = // Address to const char
como quaisquer outros tipos fazem?
c++
c
implicit-conversion
c-strings
string-literals
Weidelix
fonte
fonte
Respostas:
Você pode imaginar esta declaração
da seguinte maneira
Ou seja, o compilador cria uma matriz de caracteres com a duração do armazenamento estático que armazena a cadeia
"Anthony"
e o endereço do primeiro caractere da matriz (devido à conversão implícita de designadores de matriz em ponteiros para seus primeiros caracteres) é atribuído ao ponteiroa
.Aqui está um programa demonstrativo que mostra que literais de seqüência de caracteres são matrizes de caracteres.
A saída do programa é
O tamanho da literal da string (da matriz que armazena a literal da string) é igual
8
porque a string inclui também o caractere zero final '\0'
.No programa demonstrativo a expressão
pode ser substituído apenas pela expressão
fonte
Faz.
Um literal de string C como
está deteriorado para o endereço da sua 1 st personagem. Como, BTW; qualquer matriz em C faz.
fonte
const char[8]
(em C ++, pode estarchar [8]
em C, não tenho certeza) e, como todas as matrizes internas, ao usá-lo como um valor que decai para um ponteiro para seu primeiro elemento.char [8]
em C: c-faq.com/ansi/strlitnotconst.htmlEle precisa de um endereço de memória e possui um endereço de memória. No seu exemplo, é simplesmente o endereço de memória do início da string. É o mesmo com qualquer outra variável de matriz inicializada em tempo de compilação, por exemplo "int array [] = {0, 1, 2, 3};".
Se você usasse um editor binário para examinar o executável, veria a string "Anthony" lá. Se você colocar a linha "printf (" a está em% p \ n ", (void *) a);))" no seu programa, compile e execute, você verá o endereço.
fonte
De fato, ele precisa de um endereço de memória para apontar.
const char* a
significaa
é um ponteiro para uma string literal ou constante de caractere.Um ponteiro sempre exige um endereço para apontar, pois é da natureza de um ponteiro apontar para um objeto específico na memória. Então,
a
e qualquer outro ponteiro paraconst char
também.Uma literal de string como
"Hi My Name is Alfred!"
por uma atribuição como:decai para um ponteiro para o endereço do primeiro elemento da string literal.
Por sua vez,
a
é atribuído pelo endereço do primeiro elemento da cadeia de caracteres literal"Hi My Name is Alfred!"
que pode ser armazenado em qualquer lugar da memória, dependendo do ambiente de execução.Não está no poder de um programador em que um literal de cadeia de caracteres esteja exatamente armazenado. Sua tarefa é apenas atribuir e manipular o respectivo ponteiro adequadamente.
fonte