Se a expressão type name[count]
estiver escrita em alguma função, você solicita que o compilador C aloque nos sizeof(type)*count
bytes do quadro da pilha e calcule o endereço do primeiro elemento na matriz.
Se a expressão type name[count]
for gravada fora de todas as funções e definições de estruturas, você instrui o compilador C a alocar nos sizeof(type)*count
bytes do segmento de dados e computa o endereço do primeiro elemento na matriz.
name
na verdade, é um objeto constante que armazena o endereço do primeiro elemento na matriz e todo objeto que armazena um endereço de alguma memória é chamado ponteiro; portanto, esse é o motivo pelo qual você trata name
como ponteiro, e não como matriz. Observe que as matrizes em C podem ser acessadas apenas através de ponteiros.
Se count
é uma expressão constante avaliada como zero, você diz ao compilador C para alocar zero bytes no quadro da pilha ou no segmento de dados e retorna o endereço do primeiro elemento na matriz, mas o problema é que o primeiro elemento da matriz de comprimento zero não existe e você não pode calcular o endereço de algo que não existe.
É racional esse elemento não. count+1
não existe na count
matriz -length, portanto, esse é o motivo pelo qual o compilador C proíbe definir a matriz de comprimento zero como variável dentro e fora de uma função, porque qual é o conteúdo name
dela? Que endereço name
armazena exatamente?
Se p
é um ponteiro, a expressão p[n]
é equivalente a*(p + n)
Onde o asterisco * na expressão correta é uma operação de desreferência do ponteiro, o que significa acessar a memória apontada p + n
ou acessar a memória cujo endereço está armazenado p + n
, onde p + n
está a expressão do ponteiro, ele pega o endereço de p
e adiciona a esse endereço o número n
multiplique o tamanho do tipo do ponteiro p
.
É possível adicionar um endereço e um número?
Sim, é possível, porque o endereço é um número inteiro sem sinal geralmente representado na notação hexadecimal.