Ponteiros e Arrays
A forma mais limpa de se referir a um elemento de um array é usando array[indice]
. Outra forma, mais complicada, de fazer a mesma coisa é obter o endereço desse elemento como um ponteiro, e então desreferenciá-lo:
*(&array[0] + indice)
ou, de forma equivalente:
*(array + indice)
Isso obtém primeiro um ponteiro para o elemento zero, depois o incrementa com +
para apontar para o elemento desejado, e então obtém o valor de lá.
Essa construção com aritmética de ponteiros é, na verdade, a definição dos colchetes em C: a[b]
significa, por definição, *(a + b)
.
Essa definição trata a
e b
de forma simétrica: um deles deve ser um ponteiro e o outro, um inteiro — não importa qual vem primeiro.
Assim, como a indexação com colchetes é definida em termos de adição e desreferência, ela também é simétrica. Por isso, você pode escrever 3[array]
, que é equivalente a array[3]
. No entanto, seria tolice escrever 3[array]
, já que isso não tem nenhuma vantagem e pode confundir quem lê o código.
Pode parecer contraditório o fato de que *(a + b)
exige um ponteiro, enquanto array[3]
usa um valor do tipo array. Por que isso é válido?
Porque o nome de um array, quando usado sozinho em uma expressão (exceto em sizeof
), representa um ponteiro para o elemento zero do array. Assim, array + 3
converte implicitamente array
para &array[0]
, e o resultado é um ponteiro para o elemento 3 — equivalente a &array[3]
.
Como os colchetes são definidos com base nessa adição, array[3]
primeiro converte array
para um ponteiro. É por isso que funciona usar um array diretamente nessa construção.
Atualizado
Isto foi útil?