Você sabe porquê os Arrays Começam sempre do Índice 0?

Se você já começou a aprender programação, provavelmente já encontrou os arrays Um dos primeiros detalhes que notamos sobre arrays é que eles sempre parecem começar do número 0, e não do 1, como poderíamos esperar. Mas por que isso acontece? Hoje vamos entender de uma ver por todas porquê isso acontece!

Mas antes vamos definir o que é um array

Um array é uma estrutura de dados usada para armazenar uma coleção de elementos, como números ou palavras. Pense nele como um armário com várias gavetas numeradas, onde cada gaveta você pode guardar um item. Se você tem um array com 5 números, como [10, 20, 30, 40], cada número está em uma "gaveta". Cada uma dessas gavetas tem um índice, que nos diz onde está cada elemento.

Por que esse índice começa sempre no 0?

A razão pela qual arrays começam no índice 0 tem a ver com a forma como os computadores funcionam "por baixo dos panos". Simplificando:

Quando um array é criado, ele é armazenado na memória do computador. Cada elemento do array é guardado em um endereço de memória específico (gaveta). O índice do array significa na verdade um "deslocamento" a partir do endereço inicial. Ou seja se o array começa no endereço 1000, o primeiro elemento está no endereço 1000 + 0. O segundo elemento está no endereço 1000 + 1, e assim por diante. Portanto, o índice 0 significa "nenhum deslocamento" a partir do início do array.

História e Convenção

Esta prática de começar do índice 0 remonta às primeiras linguagens de programação, como C, que se comunicavam diretamente com a memória do computador. Essa convenção foi adotada por muitas outras linguagens de programação que vieram depois, como Python, Java, JavaScript, etc., se tornando o padrão que conhecemos hoje. E aí já sabia disso.

Só para adicionar um pouco mais de profundidade: o deslocamento depende do tamanho do tipo elemento que está sendo armazenado.

Seguindo seu exemplo de números e supondo inteiros com sinal de 32 bits, o deslocamento pode ser visualizado como:

*(&arr[0] + sizeof(int32_t) * index)

O código acima é a mesma coisa que:

arr[index]

No primeiro código, arr é o nosso array e &arr[0] é o endereço de memória do primeiro elemento de arr. sizeof é um operador (e não uma função) que retorna o tamanho do tipo do que foi passado como parâmetro, em bytes. Ao final de tudo, é pegado o valor efetivo dentro do endereço de memória adicionando *(...) em volta de tudo isso.

Note que, apesar de estar usando sintaxe de C para ilustração, a execução não funciona da maneira que você espera, pois o certo para chegar no índice desejado é *(&arr[0] + index), e o compilador faria o trabalho de descobrir o tamanho do tipo dos elementos armazenados em arr. E, claro, não tem porquê fazer isso, é só usar o segundo código.

Logo, se esse array descrito começa no endereço 0x1000, ele tem seu elemento de índice 1 sendo armazenado em:

0x1000 + sizeof(int32_t) * 1 0x1000 + 4 * 1 0x1004

Vale salientar que nem todas as linguagens usam o 0 como índice base. Lua, por exemplo, é amplamente usada no mundo dos jogos e utiliza base 1.

Excelente tópico. Não quero lançar duvidas, mas trabalhei muitos anos com FORTRAN, GWBASIC, Visual Basic versões 4, 5, assim como a brasileira e famosa Lua, o próprio MATLAB, alem das linguagens Julia e Ada , onde todos os arrays começam, por default, no índice 1, a não ser, no caso do VB, que você explicitamente diga o contrário no código fonte, com a declaração Option Base 0.

Se não me engano, shellscript com o ZSH os arrays também começam com 1 ao invés de 0, diferentemente do BASH
Rapaz, bons tempos, qdo eu trabalhava direto com scripts sh, zsh e ksh. Já vai mais de 30 anos. O zsh oferece a opção de começar arrays pelo índice 1 usando a opção KSH_ARRAYS. Quando essa opção está habilitada, os índices começam em 1, imitando o comportamento do KornShell (ksh). Se não usar essa opção, os arrays começarão no índice 0 por padrão. Já no Bash, os arrays também começam pelo índice 0, e não há opção nativa para alterar esse comportamento.

Legal, não sabia disso, achei bem interessante, quando aprendi PHP (e continuo aprendendo porque sempre tem uma forma nova de fazer a mesma coisa...) ficava me questinando porque algumas funções faziam sentido outras não porque não seguiam a convenção (agora não lembro quais).

Interessante mesmo! Só uma coisinha que reparei no texto... Vc fala que o exemplo de 5 números, mas faz um array com 4 números. Pessoas com toq agradecerão a correção, ou a explicação (se for de propósito)

> Vc fala que o exemplo de 5 números, mas faz um array com 4 números. Pessoas com toq agradecerão a correção, ou a explicação (se for de propósito). Olá `lucasbona88` foi só um erro de digitação mesmo.

Nem sempre os arrays começam pelo índice 0. Muitas linguagens foram desenvolvidas considerando que é mais natural pensar na sequência primeiro, segundo, etc do que no deslocamento. Por isso, linguagens como o Matlab, Scilab, Gnuplot, R, Fortran entre outras usam por padrão os arrays iniciando pelo índice 1.

Depois de ler o Livro de Sistemas Operacionais do Tanenbaum vários conceitos começaram a fazer sentido e ganhar clareza do por que acontece, por que tem tal forma e é feito de tal maneira.

É bom entender como as coisas funcionam. Muito interessante a explicação.

fala isso pra quem trabalha com ADVPL no TOTVS Protheus kkkk negócio é tão ruim que lá começa no 1.