Pergunta

Nas regras a seguir para o caso quando a matriz decai para apontar:

Um lvalue [ver Pergunta 2.5] do tipo de matriz de T que aparece em uma expressão decai (com três exceções) em um ponteiro para seu primeiro elemento; O tipo de ponteiro resultante é o ponteiro para T.

(As exceções são quando a matriz é o operando de um tamanho de ou e operador, ou é um inicializador de cordas literal para uma matriz de caracteres.)

Como entender o caso quando a matriz é "inicializador de cordas literal para uma matriz de caracteres"? Algum exemplo, por favor.

Obrigado!

Foi útil?

Solução

As três exceções em que uma matriz não se deterioram em um ponteiro são as seguintes:

Exceção 1. - Quando a matriz é o operando de sizeof.

int main()
{
   int a[10];
   printf("%zu", sizeof(a)); /* prints 10 * sizeof(int) */

   int* p = a;
   printf("%zu", sizeof(p)); /* prints sizeof(int*) */
}

Exceção 2. - Quando a matriz é o operando do & operador.

int main()
{
    int a[10];
    printf("%p", (void*)(&a)); /* prints the array's address */

    int* p = a;
    printf("%p", (void*)(&p)); /*prints the pointer's address */
}

Exceção 3. - Quando a matriz é inicializada com uma corda literal.

int main()
{
    char a[] = "Hello world"; /* the literal string is copied into a local array which is destroyed after that array goes out of scope */

    char* p = "Hello world"; /* the literal string is copied in the read-only section of memory (any attempt to modify it is an undefined behavior) */
}

Outras dicas

Suponha as declarações

char foo[] = "This is a test";
char *bar  = "This is a test";

Nos dois casos, o tipo de string literal "This is a test"é" Matriz de 15 elementos de char ". Na maioria das circunstâncias, as expressões de matriz são implicitamente convertidas do tipo" N-Elememor de T "para" Ponteiro para T ", e a expressão avalia para o endereço do primeiro elemento do Array. Na declaração para bar, é exatamente o que acontece.

Na declaração para foo, no entanto, a expressão está sendo usada para inicializar o conteúdo outra matriz e, portanto, é não convertido em um tipo de ponteiro; Em vez disso, o conteúdo da corda literal são copiados para foo.

Este é um inicializador de cordas literal para uma matriz de caracteres:

char arr[] = "literal string initializer";

Também poderia ser:

char* str = "literal string initializer";

Definição de K & R2:

Uma string literal, também chamada de constante de corda, é uma sequência de caracteres cercados por citações duplas como em "...". Uma string possui tipo `` array of caracteres '' e classe de armazenamento estática (consulte o par.a.3 abaixo) e é inicializado com os caracteres fornecidos. Se os literais de cordas idênticos são distintos são definidos pela implementação, e o comportamento de um programa que tenta alterar um literal de corda é indefinido.

Parece que você puxou essa citação das perguntas frequentes do Comp.lang.c (talvez uma versão antiga ou talvez a versão impressa; ela não corresponde bem ao estado atual do online):

http://c-faq.com/aryptr/aryptrequiv.html

A seção correspondente links para outras seções das perguntas frequentes para elaborar essas exceções. No seu caso, você deve olhar para:

http://c-faq.com/decl/strlitinit.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top