Olá, seja bem-vindo de volta.
Nesta aula, quero falar sobre como definir ponteiros, principalmente a sintaxe para declarar
repórter e, em seguida, usar o endereço do operador para atribuir um
endereço de memória a um ponteiro.
Portanto, até este ponto, devemos ter perfurado em nossa cabeça
que um ponteiro nada mais é do que uma
variável que aponta para um endereço de memória ou contém um endereço de memória como seu valor.
Portanto, declarar um ponteiro não é o mesmo que criar um ponteiro normal.
Portanto, você não pode fazer algo como ponteiro ponteiro.
Essa não é a maneira de declarar um ponteiro. A sintaxe é um pouco diferente.
Você usa um asterisco. Portanto, não é suficiente dizer que uma variável é um ponteiro.
Você também deve especificar o tipo de variável para a qual o ponteiro aponta.
Diferentes tipos de variáveis ocupam diferentes quantidades de armazenamento.
Algumas operações de ponteiro requerem conhecimento desse tamanho de armazenamento.
Portanto, assim como uma variável regular ao especificar um tipo de dados,
ao criar uma variável de um tipo de dados de
ponteiro, você também deve especificar esse tipo de dados.
Você pode declarar um ponteiro para uma variável do tipo int fazendo o
seguinte, int estrela ou asterisco p número.
Isso vai dizer a você que é um indicador.
O int parece o mesmo, mas depois disso vem o asterisco.
O asterisco significa um ponteiro e, em seguida, você especifica
o tipo do próprio ponteiro. Este é um ponteiro interno.
O tipo da variável com o nome p números int estrela.
Ele pode armazenar o endereço de qualquer variável do tipo int.
Um ponteiro armazena endereços. Portanto, se você
for armazenar o endereço de outra variável, essa variável
deve ser definida como um tipo inteiro.
Então aqui PI está apontando para
a variável int,
char star pc, que está apontando para uma variável de
caractere, float star pf star pg, esses são ponteiros para variáveis float.
É assim que você os define, os tipos importam.
O espaço entre o asterisco e o nome do ponteiro é opcional.
Você não precisa colocar um espaço lá. Você pode não ter espaço.
O que acaba acontecendo,
e vamos falar sobre desreferenciar uma variável, é que você costuma usar um espaço na declaração e
depois quando está desreferenciando você não o usa.
Portanto, todas essas declarações devem conter um espaço por convenção.
O valor de um ponteiro é
um endereço, portanto, deve ser representado internamente como uma imagem sem sinal na maioria dos sistemas.
Portanto, ainda precisa armazenar algo. Acontece que ele armazena um número hexadecimal.
E mesmo que esteja armazenando-o como se fosse um número inteiro, não
pense nele como um tipo de número inteiro.
As mesmas coisas que você pode fazer com inteiros, você não pode necessariamente fazer com ponteiros e vice-versa.
Portanto, mesmo que você tente imprimi-lo, pareça um número hexadecimal, não significa que
você pode tratá-lo como um inteiro.
Você pode multiplicar um inteiro por outro, por
exemplo, mas não pode multiplicar um ponteiro por outro.
Um ponteiro é realmente um novo tipo, não é um tipo inteiro.
A porcentagem p representa o formato especificado para ponteiros.
Vou continuar exibindo os diferentes dados de um ponteiro e veremos como isso é usado.
As declarações anteriores criam
a variável, mas não há inicialização. Não há nenhuma tarefa lá.
Você sempre deseja atribuir um valor
a um ponteiro, é muito perigoso se você não inicializar isso.
Portanto, você deseja inicializar um ponteiro ao declará-lo.
Se você não souber como inicializá-lo, se
não for o endereço de outra variável ou
se você não alocou memória dinamicamente para ela, você pode usar um ponteiro nulo.
Portanto, você pode inicializar um ponteiro para que ele não aponte para nada.
Você faz isso usando null.
Você diz que o número p de instar é igual a nulo para um ponteiro para um int.
Nulo é uma constante definida pela biblioteca padrão.
É o equivalente a zero para um ponteiro.
Isso significa que não aponta para nada.
É garantido que não aponta para nenhum local na memória.
Então, é bom que você queira fazer isso, porque o que significa é que
você não vai cometer nenhum erro ao fazer acidentalmente um estouro de
buffer ou gravar na memória que não deveria.
Ao inicializá-lo dessa forma, ele na verdade limita alguns erros que você pode cometer.
Falamos sobre null um pouco antes. Falamos sobre o caractere nulo.
Esse conceito é diferente do ponteiro nulo.
Um ponteiro nulo significa que ele não está apontando para nada e deve ser inicializado com isso.
Você precisa adicionar uma diretiva de inclusão para a definição padrão. h se você quiser usar a
definição nula aqui.
O endereço da operadora. Se você quiser atribuir o ponteiro
ao endereço, pode
usar o operador de endereço de uma variável existente.
Portanto, se você deseja inicializar sua variável com a adição ou subvariável que você
já declarou, você usa o endereço do operador, o "e" comercial.
Vimos isso quando discutimos a função scanf.
Aqui, estamos atribuindo uma variável de valor inteiro 99.
Estamos criando um ponteiro do tipo int e atribuindo a ele o endereço de número.
Podemos fazer isso porque number é um
int e o ponteiro que criamos também está apontando para um int.
Portanto, tudo o que precisamos fazer após o operador igual é usar o E comercial.
E agora o número p conterá o endereço do número.
O valor inicial do número p é o endereço do número da variável.
A declaração do número deve preceder a declaração do ponteiro que armazena
seu endereço porque
você não pode atribuir a um ponteiro algo
que não tenha memória alocada.
Se você tentar atribuir a esse número de ponteiro, o número não existe a menos que você faça isso depois.
Para atribuir um endereço a um ponteiro,
esse endereço deve ter memória alocada para ele.
Caso contrário, o compilador reclamará.
Porém, tenha cuidado porque não há nada de especial na declaração de um ponteiro.
Você pode declarar variáveis regulares e ponteiros na mesma instrução.
Então você poderia dizer valor duplo, valor p f núm.
Nesta declaração aqui, esta é a única
segunda variável p val é um ponteiro, as outras duas são apenas duplas.
Isso é um pouco mais explícito, um pouco
mais óbvio nessa declaração. Mas e se você disser em
estrela pq, isso implica que ambos são ponteiros e não são.
Temos apenas um ponteiro int aqui que é p, a
variável q serve apenas para digitar int.
É um erro comum pensar que peq são ponteiros.
Portanto, tome cuidado ao declarar um ponteiro em muitas variáveis na mesma linha.
Também é uma boa ideia usar nomes que começam com p como nomes de ponteiro.
Isso lhe dirá que essa variável é um ponteiro apenas olhando para ele.
Normalmente, você faz todas as suas declarações de variáveis no início de
um programa, geralmente dentro da função principal.
E quando você vê essas variáveis usadas posteriormente
no programa, você pode identificar facilmente os diferentes tipos de dados ou
os diferentes tipos de ponteiros porque eles têm p como prefixo.
Portanto, esta aula abordou como
você pode definir, declarar um ponteiro e, em seguida, atribuir um
endereço de uma variável existente a um ponteiro.
Agora, há casos em que você não deseja necessariamente atribuir
a uma variável existente um valor de ponteiro, talvez você queira alocar uma nova memória.
Vamos falar sobre isso na próxima aula. Mas agora, vamos mantê-lo simples.
Vamos nos concentrar no uso de ponteiros de
tipo ints e diferentes tipos fáceis, como duplos ou flutuantes.
E vamos nos concentrar em atribuir
variáveis existentes, o endereço de e ver como isso funciona.
Então, vamos seguir em frente. Obrigada.