"Decaimento" refere-se à conversão implícita de uma expressão de um tipo de matriz para um tipo de ponteiro. Na maioria dos contextos, quando o compilador vê uma expressão de matriz, ele converte o tipo da expressão de "matriz do elemento N de T" em "ponteiro para T" e define o valor da expressão para o endereço do primeiro elemento da matriz . As excepções a esta regra são quando uma matriz é um operando de ambos os sizeofou &operadores, ou a matriz é uma string literal sendo usado como um inicializador em uma declaração.
Suponha o seguinte código:
char a[80];
strcpy(a, "This is a test");
A expressão aé do tipo "matriz de 80 elementos do caractere" e a expressão "Este é um teste" é do tipo "matriz de 16 elementos do caractere" (em C; na string C ++, literais são matrizes de const char). No entanto, na chamada para strcpy(), nenhuma expressão é um operando de sizeofou &, portanto, seus tipos são implicitamente convertidos em "ponteiro para char" e seus valores são definidos no endereço do primeiro elemento em cada um. O que strcpy()recebe não são matrizes, mas ponteiros, como visto em seu protótipo:
char *strcpy(char *dest, const char *src);
Isso não é a mesma coisa que um ponteiro de matriz. Por exemplo:
char a[80];
char *ptr_to_first_element = a;
char (*ptr_to_array)[80] = &a;
Ambos ptr_to_first_elemente ptr_to_arraytêm o mesmo valor ; o endereço base de a. No entanto, são tipos diferentes e são tratados de maneira diferente, conforme mostrado abaixo:
a[i] == ptr_to_first_element[i] == (*ptr_to_array)[i] != *ptr_to_array[i] != ptr_to_array[i]
Recordar que a expressão a[i]é interpretada como *(a+i)(que só funciona se o tipo de matriz é convertido para um tipo de ponteiro), de modo que ambos a[i]e ptr_to_first_element[i]trabalho a mesma. A expressão (*ptr_to_array)[i]é interpretada como *(*a+i). As expressões *ptr_to_array[i]e ptr_to_array[i]podem levar a avisos ou erros do compilador, dependendo do contexto; eles definitivamente farão a coisa errada se você espera que eles avaliem a[i].
sizeof a == sizeof *ptr_to_array == 80
Novamente, quando uma matriz é um operando de sizeof, não é convertida em um tipo de ponteiro.
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 é um ponteiro simples para char.
int a[10]; int b(void);, então+aé um ponteiro int e+bé um ponteiro de função. Útil se você deseja passá-lo para um modelo que aceita uma referência.