"Decaimiento" se refiere a la conversión implícita de una expresión de un tipo de matriz a un tipo de puntero. En la mayoría de los contextos, cuando el compilador ve una expresión de matriz, convierte el tipo de expresión de "matriz de elementos N de T" a "puntero a T" y establece el valor de la expresión en la dirección del primer elemento de la matriz . Las excepciones a esta regla son cuando una matriz es un operando de cualquiera de los dossizeof o &los operadores, o la matriz es una cadena literal de ser utilizado como un inicializador en una declaración.
Asuma el siguiente código:
char a[80];
strcpy(a, "This is a test");
La expresión aes del tipo "matriz de char de 80 elementos" y la expresión "Esta es una prueba" es del tipo "matriz de char de 16 elementos" (en C; en C ++ los literales de cadena son matrices de const char). Sin embargo, en la llamada a strcpy(), ninguna expresión es un operando de sizeofo &, por lo que sus tipos se convierten implícitamente en "puntero a char", y sus valores se establecen en la dirección del primer elemento en cada uno. Lo que strcpy()recibe no son matrices, sino punteros, como se ve en su prototipo:
char *strcpy(char *dest, const char *src);
Esto no es lo mismo que un puntero de matriz. Por ejemplo:
char a[80];
char *ptr_to_first_element = a;
char (*ptr_to_array)[80] = &a;
Ambos ptr_to_first_elementy ptr_to_arraytienen el mismo valor ; la dirección base de a. Sin embargo, son diferentes tipos y se tratan de manera diferente, como se muestra a continuación:
a[i] == ptr_to_first_element[i] == (*ptr_to_array)[i] != *ptr_to_array[i] != ptr_to_array[i]
Recuerde que la expresión a[i]se interpreta como *(a+i)(que sólo funciona si el tipo de matriz se convierte en un tipo de puntero), por lo tanto a[i]y ptr_to_first_element[i]funcionan de la misma. La expresión (*ptr_to_array)[i]se interpreta como *(*a+i). Las expresiones *ptr_to_array[i]y ptr_to_array[i]pueden dar lugar a advertencias o errores del compilador según el contexto; definitivamente harán lo incorrecto si espera que lo evalúen a[i].
sizeof a == sizeof *ptr_to_array == 80
Nuevamente, cuando una matriz es un operando de sizeof, no se convierte en un tipo de puntero.
sizeof *ptr_to_first_element == sizeof (char) == 1
sizeof ptr_to_first_element == sizeof (char *) == whatever the pointer size
is on your platform
ptr_to_first_element es un simple puntero a char.
int a[10]; int b(void);, entonces+aes un puntero int y+bes un puntero de función. Útil si desea pasarlo a una plantilla aceptando una referencia.