Uma variável é uma construção lógica que é direcionada à intenção de um algoritmo, enquanto um local de memória é uma construção física que descreve a operação de um computador. De um modo geral, para executar um programa, existe um mapeamento (gerado pelo compilador) entre a noção lógica de uma variável e o armazenamento do computador.
(Mesmo na linguagem assembly, temos uma noção de variáveis (lógicas) que vão para o algoritmo e a intenção e os locais (físicos) da memória, embora sejam mais conflitantes no assembly.)
Uma variável é um conceito de nível mais alto. Uma variável representa um desconhecido (como em matemática ou atribuição de programação) ou um marcador de posição que pode ser substituído por um valor (como em programação: parâmetros).
Um local de memória é um conceito de nível mais baixo. Um local de memória pode ser usado para armazenar um valor, às vezes, para armazenar o valor de uma variável. No entanto, um registro de CPU é outra maneira de armazenar o valor de algumas variáveis. Os registradores da CPU também são locais de armazenamento de baixo nível, mas não são locais de memória, pois não possuem endereços, apenas nomes.
Em certo sentido, uma variável é um mecanismo de abstração para expressar a intenção do programa, enquanto um local de memória é uma entidade física do ambiente de processamento que fornece armazenamento e recuperação.
Pergunta 003: É verdade que um ponteiro está armazenado dentro do local da memória 0x23452? Por quê?
Não podemos dizer com certeza. Só porque existe um valor lá que funcionaria como endereço, não significa que seja esse endereço, mas sim o número inteiro (decimal) 144466. Não podemos fazer suposições sobre a interpretação dos valores apenas com base em como eles aparecem numericamente.
Pergunta 004: É verdade que um ponteiro está armazenado dentro do local da memória 0x23452? Por quê?
Esta é realmente uma pergunta estranha. Eles esperam algumas suposições com base nas caixas, no entanto, observe que os endereços aumentam em 1 para cada caixa. Em qualquer computador moderno, isso significa que cada caixa pode conter uma capacidade de endereçamento de byte a byte já é a norma há décadas. No entanto, um byte tem apenas 8 bits e pode variar de 0 a 255 (para valores não assinados); no entanto, eles mostram um valor muito maior armazenado em um desses endereços, muito suspeito. (Isso poderia funcionar se fosse uma máquina endereçada por palavras, mas não diz isso, e poucas máquinas atualmente o são, embora algumas máquinas educacionais sejam).
Com base nos quatro flashcards que mostrei a todos, eu definiria ponteiros de uma maneira ligeiramente diferente:
Um ponteiro é um local de memória cujo valor é o endereço de memória de outro local de memória.
Embora existam situações em que esse pensamento esteja correto, você está misturando metáforas aqui. A noção de uma variável vai para o algoritmo e sua intenção - não é necessário assumir que todas as variáveis têm localizações de memória. Algumas variáveis (especialmente matrizes) possuem locais de memória porque os locais de memória suportam endereçamento (enquanto os registros da CPU podem ser nomeados apenas como não indexados).
Para execução, existe um mapeamento lógico entre variáveis e instruções e localizações da memória do processador e seqüências de instruções do processador. Uma variável cujo valor nunca muda (por exemplo, uma constante) nem exige necessariamente um local de memória, pois o valor pode ser reproduzido à vontade (por exemplo, conforme necessário para seqüências de código geradas pelo compilador).
a
,0x23453
.nil
etc coisas dentro deles são os valores. Isso pode lhe parecer óbvio, mas eu não me sentiria confortável em dar respostas decisivas a essas perguntas sem ver como esses campos são definidos. Realmente não há como saber se,a
na segunda imagem, há um caractere, uma string (se houver alguma diferença) ou o nome de uma variável. Se é uma string,nil
também é uma string? Ou um valor "nulo"?