"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 sizeof
ou &
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 sizeof
ou &
, 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_element
e ptr_to_array
tê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.