Olá, seja bem-vindo de volta.
Nesta aula, quero falar sobre como acessar o valor para o
qual um ponteiro está
apontando. Portanto, lembre-se dos ponteiros, eles armazenam endereços de memória.
Esse endereço de memória realmente contém um valor de algum lugar.
E assim os ponteiros apontam para esse endereço de memória. Eu quero saber o valor
do que está apontando.
Porque eu apenas imprimiria o valor de um ponteiro que seria um endereço, mas desejo obter o endereço,
desejo obter o valor do endereço.
Portanto, você pode acessar o valor de um endereço para o qual um ponteiro
está apontando usando o operador de indireção. O operador de indireção é o asterisco.
Portanto, aprendemos como usar o asterisco para declarar um ponteiro, também
vamos usar o asterisco para encontrar o valor para o qual um ponteiro está apontando.
Portanto, ele também é conhecido como operador de desreferência porque
você o usa para desreferenciar um ponteiro.
Então, por exemplo, se você tiver um número igual a 15, você declara o
ponteiro do tipo int, apontando para um int e atribui a ele o endereço do número usando o "e" comercial.
Agora, como você obtém o valor para o qual o ponteiro está apontando.
Você pode remover a referência.
Você pode basicamente saber qual é o valor para o qual o ponteiro
está apontando, o valor é 15 porque ele está apontando para o endereço do número que é 15.
Portanto, a variável de ponteiro contém o endereço do número da variável.
Você pode usar isso em uma expressão para calcular um novo valor para o resultado.
Então, digamos que queremos que o resultado seja igual ao valor
para o qual o ponteiro aponta mais cinco. Você usaria o asterisco
antes do nome do ponteiro.
E então o que isso faria é basicamente dizer para que a variável
de ponteiro está apontando, está apontando para 15, adicione cinco a ela.
É o endereço que
o ponteiro está apontando para qual é o valor desse endereço.
Portanto, o asterisco do operador
de indireção que você deve observar também é o símbolo usado para multiplicação e
também quando declara tipos de ponteiro. Portanto, isso pode ficar muito confuso.
Como você sabe necessariamente o que está acontecendo ou como funciona o compilador.
Bem, é tudo uma questão de contexto. Depende de quando você usa esse asterisco e de onde o usa.
Se você usar o asterisco ao declarar um ponteiro logo
após o
tipo do ponteiro, obviamente está usando uma declaração.
Se você usar o asterisco entre dois números,
ele está sendo usado para multiplicação. E se for usado
logo antes do nome do ponteiro do lado direito, por exemplo, ou do
lado esquerdo, vai atribuir um valor ou acessar um valor.
Portanto, é tudo uma questão de contexto quando você usa esse
operador de indireção.
E é assim que funciona.
Então é assim que o compilador vai interpretar.
Sempre que você vê-lo neste exemplo, um ponteiro estrela
e você não tem um tipo de dados antes ou não tem
dois números em cada lado, então você sabe que é um ponteiro indireto, desreferenciando.
Então, vamos ver um exemplo. Aqui está outro
exemplo em que vamos criar uma contagem
inteira igual a 10. Também vamos criar um inteiro do tipo denominado x outra variável.
Estamos inicializando a contagem para 10, x é inicializado para nada.
Em seguida, criamos um ponteiro int. Sabemos que é um ponteiro
int porque temos o asterisco após o tipo
de dados e o chamamos de ponteiro int.
Agora vamos atribuir a esse ponteiro int o endereço de contagem.
Porque lembre-se, os ponteiros contêm apenas endereços como seus valores, mas eles
também estão apontando para algo.
Assim, podemos atribuir a variável x para qualquer ponteiro int que esteja apontando, qual
é o valor do endereço que está contido no ponteiro.
Portanto, x vai realmente exibir 10.
10 Portanto, se seguirmos em frente e exibirmos o ditado:
contar por cento d ird x por cento ird, a contagem é igual a 10, x vai ser igual a 10.
É assim que você pode cancelar a referência de um ponteiro e obter o valor dele. Ele está apontando se você deseja
exibir os valores do ponteiro porque lembre-se de que um
ponteiro tem um valor na memória,
é apenas um endereço. E se você
quiser exibir o valor dos ponteiros, que é
representado por um número inteiro hexadecimal e endereço?
Bem, você pode usar o especificador de formato percentual p. Já falamos sobre isso antes.
Isso produzirá um valor de ponteiro como um endereço de memória em formato hexadecimal.
Então, se fizéssemos algo como isto
onde, declaramos nosso número, declaramos
nosso ponteiro e o inicializamos como nulo porque é uma boa prática que queremos sempre fazer isso
sempre que você não estiver atribuindo algo em uma declaração para o ponteiro, faça certifique-se de
inicializá-lo como nulo.
Em seguida, atribuímos nossa variável numérica 10.
E então atribuímos nosso ponteiro ao endereço do número.
Portanto, o valor do número p será, na verdade, um endereço.
um endereço. Portanto, se tentássemos imprimi-lo, usaríamos por cento pe esse seria o valor do endereço.
Se quiséssemos imprimir o que está apontando, teríamos que tirar
a referência usando o operador de indireção.
Mas quando você imprime o endereço, o que ele faz é imprimi-lo
em hexadecimal e os ponteiros ocupam 8 bytes na
memória, e os endereços têm
16 dígitos hexadecimais. Então, como isso funciona?
Bem, depende se sua máquina suporta ou não endereços de 64 ou 32 bits.
Se sua máquina tiver um sistema operacional de 64
bits, você verá 16 dígitos hexadecimais.
Se sua máquina ou sistema operacional tiver apenas endereçamento
de 32 bits, você verá o hexadecimal representado como 8 dígitos hexadecimais.
E se você quiser exibir um endereço.
Você pode dizer qual é a diferença porque o ponteiro tem um valor.
Mas você também pode exibir o endereço com o endereço da operadora.
Portanto, neste exemplo, queremos exibir o endereço do número.
O número não é um ponteiro. O número é apenas um número inteiro.
Se quisermos obter o endereço disso, usamos o e comercial.
Se quisermos exibir o endereço disso, basta usar percent p novamente.
Você apenas aplica o "e" comercial.
Portanto, se fornecermos o e comercial com a variável de
ponteiro, exibiremos o endereço desse ponteiro,
não o valor do ponto. Lembre-se de que o endereço do ponteiro é algum endereço na memória.
O valor do ponteiro é um endereço para o qual ele está apontando.
E o valor para o qual está apontando está em outro lugar na memória.
Portanto, lembre-se daquela ilustração em
que mostramos como os ponteiros funcionam.
Um ponteiro, quando você o declara, cria memória para esse ponteiro,
8 bytes.
O valor desse ponteiro é um endereço.
E o que quer que esse
ponteiro esteja apontando é um valor, geralmente do tipo que você forneceu.
Mas lembre-se disso, que há realmente três partes disso.
Se você quiser imprimir o endereço dos números p, você usaria novamente o e comercial.
Esse seria o endereço do ponteiro real.
E você teria que usar a estrela vazia para contornar um aviso.
Portanto, lembre-se, um ponteiro em si tem um endereço, assim como qualquer outra variável,
ele é alocado quando você o declara.
Você usa percentual p como um especificador de conversão para exibir endereços.
Você usa o e comercial o endereço do operador para fazer referência ao endereço
que a variável de número p ocupa.
Esse é o endereço do ponteiro. Então, novamente, o ponteiro tem o
valor de um endereço.
A conversão de um void evita um aviso do compilador,
especificamente a especificação de porcentagem p espera que o valor seja algum tipo de ponteiro.
Mas o tipo de número do e comercial é um ponteiro para um ponteiro dele.
E então você tem que lançá-lo.
Exibindo o número de bytes que um ponteiro está usando.
Outra forma de obter informações sobre um ponteiro.
Aqui você pode usar o operador sizeof. Aprendemos sobre o operador sizeof
para exibir bytes de diferentes tipos de dados. Você pode fazer a mesma coisa com um ponteiro.
Em uma máquina que estou executando, isso ocupará 8 bytes.
E o endereço da máquina tem 64 bits porque
é um sistema operacional de 64 bits.
E você pode obter um aviso do compilador ao usar sizeof desta forma, sizet
é um tipo inteiro definido pela implementação.
Para evitar o aviso, você pode lançar o argumento para um tipo int como este.
Então, o que você faria é dizer tamanho do número p, porcentagem d bytes.
E você diria int, lance-o para um número de polegada do tamanho de p.
Isso vai lhe dar o tamanho do ponteiro na memória, o tamanho do ponteiro desse
endereço, que, novamente, é de oito bytes na maioria dos sistemas.
Porque isso contém apenas um endereço.
Outro exemplo aqui. Isso exibirá uma série de coisas.
E vamos executar este exemplo para mostrar a saída.
Mas antes de executá-lo, quero descrever um pouco o que está acontecendo aqui. Temos um número que foi declarado.
Temos um ponteiro que inicializou o nulo.
Definimos o valor do número como 10.
E então o que queremos fazer é imprimir
o endereço do número inteiro, e queremos imprimir o valor do número, muito simples,
usando o endereço do operador e depois apenas a variável.
Quando fazemos o endereço da operadora, fazemos porcentagem p.
Em seguida, vamos atribuir o endereço do número ao nosso ponteiro.
Em seguida, imprimiremos algumas informações do ponteiro.
Queremos gerar o endereço do próprio ponteiro.
Podemos apenas usar a porcentagem p, o número do e comercial vazio da estrela.
Queremos ver quantos bytes esse ponteiro tem na memória. Podemos dizer sizeof.
Queremos ver o valor real do ponteiro, que
é um endereço. Podemos apenas dizer o número p
sem nenhuma informação extra e então usar a porcentagem p.
Se quisermos ver o valor para o
qual o ponteiro está apontando, o valor no endereço,
fazemos estrela p número, usamos o operador de indireção.
E sabemos que o número p está apontando para um dentro, então podemos dizer por cento d.
Portanto, vamos dar uma olhada neste exemplo em blocos de código para ver como ele é realmente exibido.
O que veremos são alguns números
hexadecimais para endereços sempre que exibirmos endereços e veremos valores em outros casos.
Portanto, isso deve parecer familiar. Este é apenas um
programa que mostra como acessar diferentes partes de um ponteiro.
Então, novamente, temos um tipo de dados de número regular int
e nosso ponteiro. Nós o inicializamos como nulo.
Primeiro, exibiremos nosso número, que é 10. Isso exibirá o endereço do número e,
em seguida, exibirá o valor do número nas linhas 10 e 11.
Em seguida, atribuiremos nosso ponteiro, o endereço do número.
Se quisermos ver o endereço real do nosso ponteiro, apenas usamos o "e" comercial, o
endereço do operador, e o lançamos em void star.
Usamos porcentagem p.
Se quisermos ver quantos bytes o ponteiro está na memória, fazemos percent d sizeof.
Se quisermos ver o endereço, o valor do ponteiro de amendoim, fazemos porcentagem pe
apenas dizemos p número, porque p número é um endereço.
Se quisermos ver o que o ponteiro está apontando com o valor
do endereço que está no valor do ponteiro, apenas dizemos asterisco
p número e anulamos a referência, o operador de indireção.
Então, vamos executar isso.
Quando eu executar isso, você verá as duas primeiras coisas
que são impressas, o endereço dos números
que está na linha seis, e isso é algum número hexadecimal, 0060ff0c.
E isso na verdade está executando um programa de 32 bits, então você vê que ele tem apenas
8 bits.
a variável numérica que é 10.
Em seguida, imprimimos o endereço do ponteiro real para a memória alocada.
É um endereço diferente do número.
Porque este é o endereço alocado para o ponteiro.
O tamanho do número do ponteiro é de 4 bytes, o
que significa que é um endereçamento de 32 bits.
O valor do ponteiro, que é
o endereço do número, deve ser o mesmo e é 0060ff0c.
E você vê que pode realmente obter o endereço
do número apenas usando o nome, o ponteiro com porcentagem p.
Vimos o tamanho do operador de 4 bytes.
Se você quiser obter o valor para o qual o número p está
apontando, que é 10, você terá que desreferenciá-lo usando o operador de indireção e verá que é impresso 10.
Mas você vê que usa porcentagem p sempre que está
exibindo endereços, use a porcentagem e quando estiver exibindo valores do ponteiro inteiro ou
o número de bytes.
Portanto, esta é a sintaxe básica para acessar valores de ponteiro.
Endereço do ponteiro, e comercial, valor para
o qual o ponto está apontando, apenas o nome
da variável e o valor do próprio ponteiro é apenas o nome da variável, então
o valor que o ponteiro está apontando para usar o operador de indireção.
Obrigada. Espero que isto ajude. Estude isso, repita isso.