¿Excepción a la matriz que no se descompone en un puntero?

He visto en muchos mensajes que “en la mayoría de los casos, los nombres de los arreglos decaen en punteros“.
¿Puedo saber en qué casos / expresiones el nombre de la matriz no se descompone en punteros a los primeros elementos?

Por supuesto.

En C99 hay tres casos fundamentales, a saber:

  1. cuando es el argumento del operador & (address-of).

  2. cuando es el argumento del operador sizeof .

  3. Cuando es un literal de cadena de tipo char [N + 1] o un literal de cadena ancha de tipo wchar_t [N + 1] ( N es la longitud de la cadena) que se utiliza para inicializar una matriz, como en char str[] = "foo"; o wchar_t wstr[] = L"foo"; .

Además, en C11, el operador de alignof nuevo recién introducido tampoco permite que su argumento de matriz decaiga en un puntero.

En C ++, existen reglas adicionales, por ejemplo, cuando se pasa por referencia.