Pregunta

En las siguientes reglas para el caso cuando la matriz decae al puntero:

Un LValue [ver Pregunta 2.5] de tipo matriz de T que aparece en una expresión decae (con tres excepciones) en un puntero a su primer elemento; El tipo de puntero resultante es Pointer-To-T.

(Las excepciones son cuando la matriz es el operando de un sizeOf o y el operador, o es un inicializador de cadena literal para una matriz de caracteres).

¿Cómo entender el caso cuando la matriz es "inicializador de cadenas literal para una matriz de personajes"? Algún ejemplo por favor.

¡Gracias!

¿Fue útil?

Solución

Las tres excepciones en las que una matriz no se descompone en un puntero son las siguientes:

Excepción 1. - Cuando la matriz es el 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*) */
}

Excepción 2. - Cuando la matriz es el operando del & 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 */
}

Excepción 3. - Cuando la matriz se inicializa con una cadena 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) */
}

Otros consejos

Asumir las declaraciones

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

En ambos casos, el tipo de cadena literal "This is a test"es" matriz de 15 elementos de char ". En la mayoría de las circunstancias, las expresiones de matriz se convierten implícitamente del tipo" matriz n-elemento de t "a" puntero a t ", y la expresión se evalúa en la dirección del primer elemento del matriz. En la declaración para bar, eso es exactamente lo que sucede.

En la declaración para foo, sin embargo, la expresión se está utilizando para inicializar el contenido de otra matriz y, por lo tanto, es no convertido a un tipo de puntero; en cambio, el contenido de la cadena literal se copian a foo.

Este es un inicializador de cadena literal para una matriz de personajes:

char arr[] = "literal string initializer";

También podría ser:

char* str = "literal string initializer";

Definición de K & R2:

Una cadena literal, también llamada constante de cadena, es una secuencia de caracteres rodeados de citas dobles como en "...". Una cadena tiene el tipo `` matriz de caracteres '' y la clase de almacenamiento estática (ver par.a.3 a continuación) y se inicializa con los caracteres dados. Si los literales de cadena idénticos son distintos están definidos por la implementación, y el comportamiento de un programa que intenta alterar una cadena literal no está definido.

Parece que sacaste esa cita del comp.lang.c preguntas frecuentes (tal vez una versión anterior o tal vez la versión impresa; no coincide con el estado actual del en línea):

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

La sección correspondiente vincula a otras secciones de las preguntas frecuentes para explicar esas excepciones. En su caso, debe mirar:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top