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?