Se a expressão type name[count]estiver escrita em alguma função, você solicita que o compilador C aloque nos sizeof(type)*countbytes 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)*countbytes do segmento de dados e computa o endereço do primeiro elemento na matriz.
namena 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 namecomo 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+1não existe na countmatriz -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 namedela? Que endereço namearmazena 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 + nou acessar a memória cujo endereço está armazenado p + n, onde p + nestá a expressão do ponteiro, ele pega o endereço de pe adiciona a esse endereço o número nmultiplique 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.