Vale lembrar que essas definições variam conforme a linguagem.
Por exemplo, a alocação em um bloco de memória contínuo é verdade em C e C++, só para citar duas (mas também vale para Java e outras).
Porém, em outras linguagens como PHP e JavaScript, o "array" é uma estrutura que pode mudar de tamanho, e por isso não é alocado de forma contínua (em PHP, na verdade o "array" é implementado como uma hashtable).
Já em Python, o nome da estrutura básica é "lista", que também pode mudar de tamanho e não é alocada de forma contínua. Embora a sintaxe seja bem similar a de um array, como o uso de []
para acessar índices, etc, a implementação é diferente de linguagens que alocam de forma contínua, como C.
E mesmo a regra de ter todos os elementos do mesmo tipo também não é universal. Em JavaScript, PHP, Python e várias outras, é perfeitamente possível ter um array como [1, "abc", objeto_de_qualquer_tipo]
.
Se forçarmos a barra, até mesmo em Java podemos ter algo como:
// Em Java, um array de Object pode ter "qualquer coisa"
Object[] array = {1, "abc", null, new FileInputStream("/tmp/arquivo")};
Embora eu não recomende, é um código perfeitamente válido. Isso porque um array declarado com um tipo T
pode ter elementos que sejam subtipos de T
, por isso um array de Object
pode ter "qualquer coisa" (no caso do 1
, é feito o auto-boxing para Integer
).
Outra diferença é que algumas linguagens permitem índices negativos ou intervalos. Por exemplo, em Python lista[-1]
retorna o último elemento da lista, lista[-2]
o penúltimo, e assim por diante. E lista[2:5]
retorna outra lista, contendo os elementos dos índices 2, 3 e 4 (o intervalo é "start inclusive, end exclusive", ou seja, o primeiro índice é incluso, o último não).
Em C# tem algo similar: array[^1]
retorna o último elemento do array, array[^2]
o penúltimo, etc, e array[2..5]
retorna outro array contendo os elementos dos índices 2, 3 e 4.
Cada índice em um array é uma referência (ou ponteiro) para uma posição específica na memória onde o valor correspondente está armazenado.
Depende. Em Java, arrays de tipos primitivos não usam ponteiros e nem referências, os próprios valores são colocados diretamente no array.
Claro que como "guia geral" ou introdução ao conceito, está ótimo. Mas é sempre bom se atentar a essas diferenças, pois cada linguagem possui seus detalhes de implementação. Não dá pra achar que o array sempre vai ser igual em todas elas.