Ponteiros em C | Achraf Mad | Skillshare

Velocidade de reprodução


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Assista a este curso e milhares de outros

Tenha acesso ilimitado a todos os cursos
Oferecidos por líderes do setor e profissionais do mercado
Os temas incluem ilustração, design, fotografia e muito mais

Aulas neste curso

    • 1.

      1 Introdução

      2:21

    • 2.

      2 Introdução aos ponteiros em C

      12:16

    • 3.

      3 como primeiro exemplo prático

      5:18

    • 4.

      4 Passe por valor e passe por endereço em C

      3:28

    • 5.

      6 incremento de ponteiros e decrement

      6:54

    • 6.

      7 Adição e subtração

      7:16

    • 7.

      8 ponteiros e matrizes

      11:15

    • 8.

      9 ponteiros de vazio e nulo

      10:42

  • --
  • Nível iniciante
  • Nível intermediário
  • Nível avançado
  • Todos os níveis

Gerado pela comunidade

O nível é determinado pela opinião da maioria dos estudantes que avaliaram este curso. Mostramos a recomendação do professor até que sejam coletadas as respostas de pelo menos 5 estudantes.

81

Estudantes

2

Projetos

Sobre este curso

Ponteiros em C para sistemas SystemsThis curso vai ensinar como usar ponteiros em C para criar programas poderosos de sistemas embarcados.

O que você aprenderá

  • Este curso vai ensinar como usar ponteiros em C para criar programas poderosos de Sistemas Embed.
  • Você vai aprender como os ponteiros podem tornar seu código mais eficiente e conciso.
  • As lições são projetadas para pessoas que têm alguma experiência em programação de sistemas embarcados, mas são novas em ponteiros.
  • Depois de concluir este curso, você vai poder escrever código mais eficiente e mais legível.
  • Você também terá acesso ao código fonte para todos os programas de exemplo cobertos no curso.
  • Ambiente de desenvolvimento
  • O que são ponteiros? Como eles funcionam? Por que precisamos deles?
  • Como usar ponteiros e alocação de memória.
  • PASSA POR VALOR VS. PASSA POR ADDRES.

Neste curso, vamos explorar quais são os ponteiros e como eles tornam possível otimizar o código do programa.

De fato, você pode criar programas sem usar ponteiros. Mas eles aceleram dramaticamente o tempo de execução do programa, que muitas vezes é muito importante quando se trabalha com microcontroladores. Nesta aula, dada a complexidade de certos tipos de dados e o valor de bytes, uma explicação da eficácia da conversão de ponteiro será explicada.

O desempenho do programa pode ser significativamente acelerado pelo uso de ponteiros ao trabalhar em um algoritmo. Neste curso, você também vai aprender como diferentes tipos de ponteiros são usados em C.

Este curso é projetado para ensinar os alunos como usar ponteiros em C para programação de microcontroladores. O curso começa com os conceitos básicos de ponteiros e passa para tópicos mais avançados. Os alunos vão aprender como usar ponteiros para criar, ler e gravar dados nos registros e memória de microcontroladores. O curso também cobre como usar ponteiros com matrizes e cordas.

Se você está procurando um guia abrangente para ponteiros em C, não procure mais do que este curso. Os ponteiros são um dos aspectos mais importantes da programação de C, e este curso vai ensinar tudo o que você precisa saber. Você vai aprender como usar ponteiros para criar e acessar matrizes, cordas e estruturas. Você também vai aprender como usar ponteiros para controlar o fluxo do programa. O curso é projetado para iniciantes, portanto, nenhuma experiência prévia com ponteiros é necessária.

Os tópicos incluem:

  • Ambiente de desenvolvimento

  • O que são ponteiros? Como eles funcionam? Por que precisamos deles?

  • Como usar ponteiros e alocação de memória.

  • PASSA POR VALOR VS. PASSA POR ENDEREÇO

  • OPERAÇÕES em POINTERS

  • Subtração e adição

  • Relação de matrizes com ponteiros

  • Ponteiros de adormecimento, selvagem, vazio e nulo

Conheça seu professor

Teacher Profile Image

Achraf Mad

Creative Engineer

Professor

Hello, I'm Achraf.

A passionate engineer who loves to share his knowledge with the world

Visualizar o perfil completo

Level: All Levels

Nota do curso

As expectativas foram atingidas?
    Superou!
  • 0%
  • Sim
  • 0%
  • Um pouco
  • 0%
  • Não
  • 0%

Por que fazer parte da Skillshare?

Faça cursos premiados Skillshare Original

Cada curso possui aulas curtas e projetos práticos

Sua assinatura apoia os professores da Skillshare

Aprenda em qualquer lugar

Faça cursos em qualquer lugar com o aplicativo da Skillshare. Assista no avião, no metrô ou em qualquer lugar que funcione melhor para você, por streaming ou download.

Transcrições

1. 1 Introdução: Olá e seja bem-vindo a este novo curso em que vamos mastigar ponteiros em C. Neste curso, você aprenderá o que são ponteiros, como eles nos permitem otimizar o código do programa. E você aprenderá como converter tipos de dados complexos em uma sequência de bytes. Você pode desenvolver programas sem usar ponteiros, mas eles aceleram significativamente a execução do código do programa, que é especialmente importante quando se trabalha com microcontroladores. E neste curso, abordaremos tudo sobre isso. A maioria de vocês sabe que os ponteiros é um dos tópicos muito importantes. Para todos os engenheiros de sistemas incorporados. Qualquer pessoa que programar em C deve usar ponteiros ou ele falhará para trás. Muitas entrevistas ou desenvolvedores de sistemas incorporados, entrevistas fazem muitas perguntas sobre ponteiros. E o objetivo deste curso é ajudá-lo a começar e aprender a usar ponteiros e os diferentes tipos de ponteiros explodir, cobrindo muitos tópicos importantes. Vamos explicar tudo e nós lhe daremos exemplos práticos, tarefas e muitos outros recursos para ajudá-lo a dominar ponteiros em C. Agora, digamos que estamos marcando o que você vai aprenda neste curso. Você aprenderá endereçamento indireto usando ponteiros. Em seguida, abordaremos diferentes tipos de ponteiros. Depois disso, falaremos sobre ponteiros, dois tipos principais e ponteiros para matrizes. Também falaremos sobre ponteiros para funções. Ponteiros, o vazio, variáveis dinâmicas e operações de ponteiros. E então falaremos sobre tipos de dados, conversão usando ponteiros. E todos esses tópicos serão abordados em detalhes. Novamente, você tomará tarefas para que tenhamos certeza de que você tem o que explicamos. Também explicaremos exemplos práticos. Vamos resolvê-los juntos para lhe dar uma experiência prática. Obrigado por assistir a esta introdução. Vejo você lá dentro. 2. 2 Introdução às dicas em C: Olá e seja bem-vindo a esta nova lição na qual vamos falar sobre ponteiros. O ponteiro é uma variável que armazena o endereço da memória como valor h. As coisas podem não ficar claras neste momento. Então, vamos primeiro falar sobre a sintaxe para criar um ponteiro. Então falaremos sobre essa definição. Como você pode ver aqui, temos sintaxe diferente para definir um ponteiro. O primeiro é digitar no tipo de ponteiro, adicionar o sinal de asterisco depois digitar o nome do ponteiro, adicionando um ponto e vírgula. O mesmo acontece aqui, mas em vez de escrever o asterisco próximo ao nome do ponteiro, estamos escrevendo-o perto do tipo de ponteiro. A terceira sintaxe é a mesma que as duas primeiras, mas estamos deixando espaço depois e antes do sinal do asterisco. Agora, na prática, você pode ver aqui que temos um ponteiro chamado PTR. O tipo desse ponteiro é inteiro. E para fazer esse ponteiro, devemos adicionar o sinal do asterisco. Agora, aqui estamos adicionando-o logo antes do nome do ponteiro. Aqui estamos adicionando-o logo após o tipo de ponteiro. E aqui estamos adicionando-o no meio entre o nome do ponteiro e o tipo. Agora, como você pode ver aqui, não há diferença nessas três sintaxe. Todos definem um ponteiro que aponta para o tipo inteiro, que é o objetivo principal de um ponteiro. Agora, novamente, um ponteiro aponta. Este é um ponteiro que aponta para um local na memória. Então, novamente, o ponteiro é uma variável que armazena o endereço da memória como seu valor. Agora, para deixar as coisas mais claras, este é um exemplo. O endereço do operador é um operador unário representado pelo símbolo. E agora, se você olhou aqui para esse símbolo, isso é chamado de endereço do sinal e. Ele fornece o endereço de qualquer variável se for precedido o nome da variável. Para deixar isso mais claro, se escrevermos isso e x, agora este x significa me dar o endereço de x. O endereço de x será armazenado dentro do RTP. E neste caso, temos essa memória. E esta é a variável x. Agora, o endereço da variável x é de mil. Agora, o valor de x é dez dentro da memória, mas o risco de anúncio de x na memória é de mil. Então, para alcançar esse número, que é de mil, precisamos escrever isso e x. Então o RTP aqui será igual 1 mil porque usamos o não assinado, que significa o endereço. Portanto, o endereço do operador é um operador que leva apenas um argumento. É basicamente o símbolo e. Ele fornece o endereço de qualquer variável se for precedido o nome da variável. Agora. E x é igual a dez, o que é esse. Agora, x é igual a dez. É uma frase correta. Estamos criando uma nova variável chamada x. Estamos dando a ela um valor de dez. Então ele irá para a memória, criará uma nova variável chamada x aqui, e está dando a ela um valor de dez. Agora int asterisco sinal PTR, estamos criando um ponteiro do tipo inteiro chamado BT off. E aqui está esse ponto ou que criamos o VTR. E o tipo de dados é inteiro. Agora, a última etapa é adicionar um endereço dentro do ponteiro. Para fazer isso, usamos essa linha, PTR é igual ao endereço x. Agora, um sinal, novamente, é chamado outros. Vamos encontrar o endereço de x, e vamos armazenar o endereço de x dentro do BPR. Então, o endereço de x aqui é de mil. Então, estamos armazenando mil dentro da BT estão usando essa linha. Agora. Adicione isso PTR é igual a quê? Você consegue pensar sobre isso? Já mencionamos que e seno é o endereço do VTR, agora é uma variável na memória. É um ponteiro, mas tem uma localização na memória. Então isso é tudo RTP e o outro, então o VTR é 2000, então t é igual a 2 mil. Então esse sinal é chamado de endereço do seno. Agora, tenha em mente que esse ponteiro em si é uma variável, tem um endereço na memória de dados. Como qualquer variável. A única diferença é que o ponteiro contém um endereço de outra variável. Ele não contém dados regulares, ele contém um endereço de outra variável. Agora, vamos limpar a tela para que possamos finalizar isso. Agora, aqui definimos um inteiro chamado x e inicializamos com valor com frequência. Em seguida, definimos um ponteiro para int chamado VTR. Depois disso, inicializamos o RTP com o endereço de x. Dessa forma, temos tudo pronto. Agora, podemos fazer algumas operações. Primeiro, já definimos nossa variável chamada x, que tipo é inteiro, e demos a ela um valor de dez. Definimos o ponteiro para n chamado VTR e o inicializamos. Agora, neste caso, veja esta frase. Temos o sinal do asterisco e temos o nome do ponteiro. E temos aqui iguais. Agora, o operador de desreferência é um operador unário representado pelo asterisco do símbolo. Isso é chamado de operador de desreferência. E você precisa memorizar esses nomes que já mencionamos e qual é o endereço disso. Agora temos o sinal de asterisco, que é o operador de desreferência. Ele diz NOT operador, o que significa que ele só leva uma variável. Ele opera em uma variável de ponteiro e dá a capacidade acessar a variável para a qual o ponteiro aponta. Agora, as coisas podem não estar claras neste momento, mas chamamos de elétrons porque isso tira a necessidade do endereço. E isso permite que você lide diretamente com a variável para a qual o ponteiro aponta. Vamos explicar isso com um exemplo. Como você pode ver aqui, temos x, temos VTR. Agora o PTR tem o endereço de x, que é de mil, e x tem um valor de 50. Agora, já sabemos que x tem um valor de dez. E para mudá-lo para 50, estamos fazendo o seguinte. A primeira coisa que estamos fazendo aqui é que estamos escrevendo esse operador de desreferência. E você pode vê-lo aqui. Em seguida, o nome do ponteiro. Agora isso significa ir ao RTP e verificar o endereço dentro dele, que é de mil. E vá para a variável que tem esse endereço. Então, neste caso, o RTP de referência significa x, porque mil está apontando para x aqui, que é essa variável. E estamos dizendo que queremos armazenar 50 dentro disso. Não estamos armazenando isso dentro do RTP. O Ptr faz é isso. Estamos armazenando-o dentro dessa referência div do RTP, que é basicamente a variável x. Então x é igual a 50. É por isso que removemos dez. E agora um novo valor é 50. Agora vamos limpar o ANC e explicá-lo novamente. Agora, o valor x é dez. Quando usamos o operador de desreferência, que é o sinal de asterisco, estamos dizendo a ele para desreferência PTR, que é um ponteiro. Desreferenciar um ponteiro significa ir para a variável para a qual um ponteiro está apontando. E neste caso, o ponteiro está apontando com este endereço para a variável x. Então, escrevendo asterisco ou desreferência PTR, também dizemos a ele para ir para x e torná-lo igual a 50. Agora vamos explicar isso. Se tivermos outra variável, digamos que temos y aqui e temos 3 mil aqui, que é o endereço. E temos outro RTP aqui entre o R1. E vamos adicionar o endereço de y, 3 mil. Agora, se você escreveu assim. Agora vamos fazer o valor de 55. Vamos adicionar o sinal de asterisco PT R1 igual, digamos 15. Agora isso significa desreferência. Pt R1 significa ir para a variável ou ir para o ponteiro chamado BT R1. Obtenha o endereço dele e verifique a variável para a qual esse endereço está apontando esse endereço está apontando e altere seu valor para 15. Então, o primeiro passo é ir para o ponteiro PT R1, verificando o endereço. Depois de verificar o endereço, vá para a variável para a qual esse endereço está apontando, que neste caso é y, e alterando o valor de y para 15. Então agora y é igual a 15. Agora, para resumir as coisas, o não assinado significa o endereço do RTP. Quando adicionamos um sinal de asterisco antes do ponteiro, estamos desreferenciando o ponteiro. Portanto, estamos basicamente dando a ele a capacidade de acessar a variável para a qual o ponteiro está apontando. E esse é o principal objetivo desse sinal de desreferência. Agora, na próxima lição, resolveremos um exemplo prático que preciso que você tente resolvê-lo sozinho. Eu precisava criar um programa que definisse um número inteiro e inicializá-lo com ele e, em seguida, imprimi-lo. Depois, defina um ponteiro que aponte para esse inteiro e altere o valor do inteiro através do ponteiro para B20. Em seguida, imprima novamente. Agora, a saída esperada é x antes da mudança é dez. X após a mudança é 20. Certifique-se de resolvê-lo antes de passar para a próxima lição. Obrigado por assistir a esta lição. 3. 3. Resolvendo o primeiro exemplo prático: Olá e seja bem-vindo a esta nova lição na qual vamos resolver a primeira pergunta. Você precisa criar um programa que defina um número inteiro e inicializá-lo com dez e, em seguida, imprimi-lo. Depois. Defina um ponteiro que aponte para esse interior e altere o valor do n através dos ponteiros para B20. Em seguida, imprima novamente. A saída deve ser essa. X é dez, depois x depois alterá-lo usando ponteiro, será 20. Para resolver essa pergunta, todos usam o Visual Studio Code. Vá para o Menu Iniciar e o código visual studio direito. Aqui está. Agora. Você precisa criar um novo arquivo ou um novo projeto. Agora, arquivo, novo arquivo. E aqui você precisa clicar em selecionar um idioma e escolher C. Agora, estamos prontos para ir. O primeiro passo é incluir a biblioteca string.h de saída de entrada std, que é a principal biblioteca de saída de entrada padrão para o nosso programa. Então eu deveria incluir DST. Ordem para gravar. Depois de fazer isso, você precisará ir para n. Quero dizer, esta será nossa principal função que será executada, não levará nada que seja nulo. E o primeiro passo aqui é definir um novo inteiro. Então x é igual a 0. Em seguida, imprima f. Vamos pedir ao usuário que insira o valor. Então, insira um número. Agora, precisamos digitalizar este número usando o scan f. O número que vamos sair que vou escanear será um número decimal. Então aqui, certo. Tudo isso foi explicado em nosso curso de programação C. E não há necessidade de explicar novamente porque estamos ensinando dicas aqui. Agora. Precisamos imprimir novamente o valor anterior e o novo valor. Então x antes da mudança. X antes da mudança é a porcentagem d. Agora precisamos alterar x usando ponteiros. Então, vamos criar um novo ponteiro. Vamos apontar para o endereço de x. Agora, para alterar o valor de x, usaremos o operador de desreferência, que é o asterix PTR, e torná-lo igual a 20, que é o novo valor. E vamos imprimir a mesma linha, que é essa. Mas diremos depois da mudança. Agora, temos tudo pronto e pronto. Podemos alterar este x com o RTP de referência e planejaremos a mesma coisa. Podemos adicionar aqui, esta UTR e a outra disciplina que isso significa x também, porque estamos desreferenciando o endereço dentro do RTP, que é o endereço de x, então será o valor de x. agora , observe o código. Você pode simplesmente colá-lo no Notepad Plus, Plus, como já explicamos, e salvá-lo. Vamos chamá-lo de exemplo de ponteiros. Agora precisamos salvá-lo como ponto c. E vamos executá-lo. Agora, quais ponteiros IGCSE, exemplo, nazista. Depois disso, escreva um ponto EXE. E como você pode ver, ele está pedindo a Deus, por favor, insira um número. Digamos que cinco. Agora, x antes da mudança é cinco, x após a mudança é 20, que é exatamente o que fizemos aqui. Alteramos o valor de x usando ponteiros. É isso para esta lição. Obrigado por assistir. 4. 4. Passe por valor e passe por endereço em C: Olá e seja bem-vindo a esta nova lição na qual vamos explicar passar por valor e passar pelo endereço. Agora, nesta lição, vamos discutir essas duas guias de passar o valor e o endereço. O primeiro tipo é passado por valor. Isso significa que você está fazendo uma cópia na memória do valor real dos parâmetros que é passado. Uma cópia do conteúdo do parâmetro real. No passado por endereço ou passagem por referência. Você está basicamente fazendo uma cópia na memória do endereço do parâmetro real. Dois não estão fazendo uma cópia do valor do parâmetro. Estamos fazendo uma cópia na memória do endereço do parâmetro real. Agora, vamos dar uma olhada nesses exemplos. Novamente, passar por valor fará uma cópia na memória do parâmetro real enquanto passado por endereço ou refinanciamento fará uma cópia na memória do endereço do parâmetro real. Então, aqui estamos fazendo uma cópia do endereço. Aqui estamos fazendo uma cópia do parâmetro real. Agora, como você pode ver neste exemplo, aqui temos uma função e essa função é chamada por função de valor. É preciso inteiro x. Agora essa função usa um argumento por valor porque ela usa um valor real, que é basicamente uma variável x do tipo inteiro. Agora, aqui, quando estamos chamando a função, estamos passando a variável que fazendo uma cópia do parâmetro real. Estamos lidando apenas aqui com valores reais, parâmetros reais, não estamos lidando com endereços. Agora, quando se trata de passar por endereço ou referência, como você pode ver, nesta função, temos uma função chamada por outros função e ela toma um ponteiro como entrada. Então asterisco inteiro PTR, este é um ponteiro. Agora, essa função usa um endereço como estranho. Portanto, a entrada para essa função deve ser um endereço. E estamos passando a variável z por outros aqui. Não podemos adicionar porque é basicamente um valor. E essa função quer um endereço. Então, aqui adicionamos o sinal e, que significa o endereço dele. Como você pode ver aqui. Agora, o endereço de z será passado para a função de endereço de byte. Enquanto aqui o valor de z será passado pela função de valor. Então, estamos basicamente fazendo uma cópia do parâmetro real. Enquanto aqui estamos fazendo uma cópia na memória do endereço do qual é o endereço do parâmetro real. E esta é a principal diferença entre passar por valor e passar por endereço. Existem diferentes casos de uso e você tomará alguns exemplos práticos. Mas isso é tudo o que você precisa saber por enquanto sobre passar por valor e passar pelo endereço. 5. 6 incremento e decrement de apontadores: Olá e seja bem-vindo a esta nova lição. Falaremos sobre operações em ponteiros. Agora. A primeira operação sobre a qual vamos falar é as operações de incremento e decréscimo. A operação de incremento incrementa o valor do ponteiro em uma etapa. Agora, não dissemos por um byte porque essa etapa pode ser 148 ou qualquer número de bytes é o tamanho do ponto t. Agora, se escrevermos PTR plus plus, se assumirmos que o PTR é um ponteiro para inteiro, então quando estamos dizendo mais, além disso, estamos indo um passo inteiro, que é basicamente quatro bytes. Dependendo do compilador. O compilador tem inteiro como quatro bytes. Isso significa que cada incremento adicionará quatro bytes ao endereço do RTP. Agora assumindo que um endereço de RTP é de mil, isso significa que estamos agora em 1004 por causa desses quatro bytes. Portanto, cada incremento ou cada incremento de ponteiro incrementará o valor do ponteiro em uma etapa. Novamente, o stub é o tamanho do ponto sem inteiro ou string ou caractere, ou qualquer tipo de dados. Agora, quando se trata do decréscimo, é o mesmo cenário. Diminui o valor do ponteiro em uma etapa. Está escrito assim, RTP menos menos. E se assumirmos que o número inteiro é de quatro bytes, significa que ele vai voltar quatro passos, ele se tornará 996. E é basicamente assim os incrementos e decrementos funcionam. Agora vamos ver isso na prática. Agora vamos começar com um exemplo simples. hash inclui stdio.h. Agora int main, void. E vamos selecionar o idioma a ser c. Agora, vamos criar uma nova variável e x é igual a dez, e criar um ponteiro. Agora, o RTP manterá o endereço de x. e isto é, são três frases simples. Agora, o que precisamos fazer é incrementar ou diminuir o RTP. Mas primeiro precisamos imprimir. Então, vamos escrever print f endereço PTR, e precisamos imprimir o endereço do ponteiro. Agora, adicione P como o especificador de formato. E p N aqui significa barra de ponteiro n. E depois disso você pode adicionar o endereço de uma instância do ECS. Você pode adicionar PTR, ambos funcionam. Agora vamos adicionar o endereço de x. Para evitar que o anúncio esteja corretamente, precisamos lançá-lo como nulo. Agora, vamos executar isso para ver como as coisas vão. Então, abra a pasta contendo, vamos primeiro salvar esse arquivo. Vamos chamá-lo de elemento ponteiro. Vamos ver. Agora, depois disso, vamos combinar esse ponteiro. Vamos usar ls primeiro, ponteiro GCC ponto c. Agora vamos encontrar um EXE. E aqui temos o endereço do RTP é 01, F, 1 quarto. Agora podemos executar esse incremento e decréscimo para ver como as coisas vão. Aqui, você pode dizer PTR plus plus e PTR menos menos. Agora você notará que, se substituímos isso por RTP, vamos tentar executar os códigos. Como você pode ver, estamos obtendo os mesmos resultados. Agora. Vamos imprimir a mesma coisa após os incrementos e, em seguida, imprimir a mesma coisa após os dois pontos. Agora, o incremento aumentará o endereço em quatro, que é o número de bytes e um inteiro. Em seguida, ele o recuperará em quatro usando o decremento. Então, vamos ver como as coisas vão funcionar. Voltando. Vamos combinar usando o GCC. Vamos correr. Aqui está. Agora, como você pode ver aqui, 61 E14. Depois que aumentamos em quatro bytes, é 18. Agora, decrementei o valor novamente, PDR menos menos. Então agora está de volta a um para aumentar em quatro bytes, depois diminuiu em quatro barras. Então vá para o local original. Novamente, RTP, aumenta e diminui dependendo do tipo do ponto. Agora podemos mudá-lo para personagem. Agora, se voltarmos aqui, vamos tentar combinar. Agora corra, como você pode ver, esse ator é apenas um byte. Agora está em 17, incrementando-o em 18. E ao decrementar novamente cuspiu em 17. Assim, como você pode ver, o incremento e o decréscimo acontecem no nível de bytes, dependendo do tipo de dados. E está incrementando e decrementando o endereço. Não é o valor. Obrigado por assistir a esta lição. Se você tiver alguma dúvida, estou aqui para ajudar isso. 6. 7 Adição de ponteiros e subtração: Olá e seja bem-vindo a esta nova lição em que falaremos sobre adição e subtração em ponteiros. Agora, para subtrair o valor do ponteiro, vamos primeiro definir um novo ponteiro. Então, vamos adicionar x é igual a dez. E isso cria um ponteiro. Vamos apontar esse ponteiro para o endereço de x. Agora, como no nosso exemplo anterior, nós os definimos e vamos fazer operações sobre isso. O primeiro passo é subtração do ponteiro para subtrair o valor do ponteiro. Ptr é igual a RTP menos, digamos que quatro. Porque estamos lidando com um número inteiro. Aqui estão assumindo que o número inteiro é de quatro bytes. Mas você pode subtrair qualquer valor. Agora, uma vez que você executar este comando, se assumirmos que o endereço PTR é de mil, agora ele se tornará 960 ou 84, desculpe, porque temos quatro bytes e quatro por quatro é de 16 bits. Então voltamos 16 bits. Agora é quando se trata do nível bit. Agora, para deixar as coisas mais claras, vamos imprimir. Obrigado. Então imprima f, endereço , valor, a porcentagem seja costura e barra. Agora, aqui queremos imprimir o valor do RTP. Devemos lançá-lo. E então podemos adicionar B2. Agora, para imprimir o valor depois que subtraímos quatro dele. Vamos voltar e executar isso. Então, salve. Este é o nome do nosso arquivo. Então, vamos copiar o nome. Agora. Vamos executar esse código. Agora, compilador GCC E. E aqui temos isso. Como você pode ver aqui. O valor antes da subtração é se B14. Agora, o valor após a primeira subtração, subtração é 04. E aqui voltamos. Como você pode ver, subtraímos quatro disso. Agora, saiba exatamente quantos passos voltamos. Vamos subtrair um. Agora salve esse código novamente, volte, combine e execute o código. Agora, como você pode ver, quando subtraímos um, passamos de 14 para dez. Voltamos quatro passos. Agora, se subtraímos quatro, voltaremos 16 passos. Agora, outra coisa que você pode fazer com ponteiros é subtrair o ponteiro do ponteiro. Então, vamos criar outra variável. Vamos chamá-lo de y. e vamos criar outro ponteiro. Vamos chamar isso e essa ferramenta. E vamos mudar os valores x e y. Beta1, beta2. Aqui temos RTP um, e aqui temos PTR C2. Agora, o que precisamos fazer é o seguinte. Vamos criar int x igual R1 menos PTR a. Aqui estamos assumindo que temos dois ponteiros. E ambos são ponteiros para inteiro, que é de quatro bytes. Agora, o PTR um menos beta dois retornará o número de etapas entre eles. Então, vamos fazer isso. E o último passo é imprimir. O resultado é porcentagem d barra n. E n. Aqui precisamos adicionar x sobre x. Agora, vamos voltar para a linha de comando. Agora. Temos problema aqui. X é definido novamente, então precisamos fazê-lo. Agora, como você pode ver aqui, temos ponto ou outro. Temos ponteiros para abordar. E subtraímos um ponteiro de uma ferramenta de ponteiro de quadro. E descobrimos que o espaço entre eles é esse número. Agora, quando se trata da adição de ponteiros, podemos adicionar um valor a um ponteiro. Para fazer isso, podemos simplesmente fazer o seguinte. Podemos dizer que o PTR V1 é igual a V2 R1 plus, digamos quatro. E podemos imprimi-lo usando o comando de impressão que todos nós usamos. R1, vazio B para R1. Certo? Agora, já sabemos que temos em outros serão impressos aqui. Então, vamos ver como isso afetará o resultado. Agora, edite EXP. E aqui estamos nós. Este é o endereço PT R1. E este é o endereço depois de adicionar quatro ao valor PT R1. Como você pode ver, ele se move de 08 para 18. E é disso que estamos falando. Você pode adicionar ou subtrair valores facilmente dependendo do tipo de operação. Agora, a coisa que não é permitida é, então adicionar um ponteiro a um ponteiro como o, tipo, subtraindo-os aqui é proibido. Não é permitido e resultará em um erro de compilador. Se você tentar adicionar um ponto em 1 ou dois com um sinal de mais, você receberá um erro de compilação. Portanto, só é permitido adicionar um valor ao ponteiro. Não é permitido adicionar dois ponteiros juntos. Mas você pode subtrair o valor de um ponteiro ou subtrair dois ponteiros um do outro. É isso para esta lição. Se você tiver alguma dúvida , pergunte e se você estiver no quadro. 7. 8 Ponteiros e matrizes: Olá e seja bem-vindo a esta nova lição na qual vamos falar sobre matrizes e funções. Agora, a primeira coisa que você precisa saber é que o nome da matriz é o endereço do primeiro elemento nele. Portanto, se salvarmos e ARR, que é uma matriz que tem dez elementos, então este é o endereço do SE, do primeiro elemento e da matriz que é o elemento 0. É exatamente como dizer que em risco de a são todos 0. Esses dois são idênticos. Portanto, definir uma matriz usando esse método significa que estamos apontando para o endereço do primeiro elemento na matriz. Agora, todos os elementos da matriz são salvos sequencialmente na memória. que significa que se você tiver um ponteiro para o primeiro elemento na matriz, incrementar o ponteiro faz o ponto ou apontar para o segundo elemento e continuar incrementando-o para alcançar o terceiro, quarto, quinto e assim por diante. Agora, outra coisa boa a saber é que lidar com a matriz e o fato que os dados animais são o endereço de seu primeiro elemento nos permite fazer muitas coisas usando arrays usando-os como ponteiros. Novamente, o ARR aqui é o mesmo que o endereço de 0. que significa que se você passar o nome da matriz ARR para a função chamada, digamos função. Então, função. E nós o damos. Então, neste caso, estamos passando o endereço. Não estamos passando valor. Portanto, esse protótipo de função deve ser declarado como função void seguinte. E aqui precisamos ter certeza que estamos adicionando um ponteiro. Não estamos passando por valor. Estamos passando torta Alice, mesmo que estejamos escrevendo, não estamos escrevendo nada que indique que este é um ponteiro. Mas, como já mencionamos, esse é o nome da nossa matriz. E o nome da matriz é basicamente o endereço do primeiro elemento na matriz. E isso vem muito, perguntas e entrevistas do MCQ e em vários cenários diferentes. Agora, dentro da função, quando queremos desreferenciar o PTR, que é o ponteiro. Isso significa que estamos acessando o primeiro elemento da matriz. E se fizermos isso, aumentamos o RTP em um. Em seguida, estamos acessando o segundo elemento dessa matriz. B a R. Two é o terceiro elemento, e assim por diante. Você precisa ter certeza de manter essas notas em mente ao lidar com matrizes dentro de C. Porque os arrays são muito parecidos com ponteiros, e entender os ponteiros fará lidar com array são um trabalho muito mais fácil. Agora, outra nota importante é que o TR subscrito e operador de desreferência ao lidar com ponteiros e matrizes. Agora, o operador subscrito, que são esses dois sinais, foi usado com matrizes quando estamos definindo um novo array. Também pode ser usado com ponteiros. Então, digamos que temos um ponteiro. Então, vamos comentar. Certo. Digamos que temos um ponteiro, RTP. Agora, quando dizemos PTR 0, usando este operador subscrito, significa o mesmo que dizer, belos detalhes de dança. Esses dois são idênticos. Estamos chamando o primeiro elemento ou o primeiro endereço do ponteiro. Agora, quando queremos acessar o segundo endereço após o endereço do ponteiro, podemos simplesmente escrever um PTR. E, nesse caso, estamos acessando o endereço ao lado desse primeiro endereço RTP. E é o mesmo que agora o PTR aqui é o mesmo que desreferenciar PTR blas um. E o RTP dez, por exemplo, é o mesmo que desreferenciar o PTR que perdeu dez. E esse é o ponto principal aqui. Podemos usar o subscrito dois. Operador com ponteiros, assim como matrizes para alcançar ou encontrar um elemento exato. Agora, para deixar as coisas ainda mais claras, por que não? Tentamos isso com um exemplo prático. Vamos remover tudo isso. Agora. Primeiro, definirei uma função. E como a maioria de vocês sabe, para definir uma função, primeiro, precisamos chamar o protótipo ou iniciar um protótipo. E então precisamos implementar a função, a implementação da função. Então precisamos chamá-lo. Então, vamos primeiro começar com o protótipo. Vamos chamá-lo de divertido. E aqui e asterisco PTR. Portanto, esta função tomará PTR ou ponteiro como entrada e não retornará nada. Agora, vamos encontrar a implementação da função. Remova isso, adicione dois aparelhos encaracolados. Aqui. Precisamos adicionar um loop for. Dentro deste loop for será feito um loop de 0 para, digamos, dez eu mais mais. E aqui, precisamos adicionar print f. E aqui precisamos imprimir os valores. E seríamos muito difíceis. Mas em vez de combater o RTP sozinho, usaremos o TR subscrito e adicionaremos exatamente como com matrizes. Depois de fazer isso, podemos chamar a função. Agora vem o truque. Quando estamos chamando a função, não estamos passando, digamos um valor, estamos passando um endereço porque, como você pode ver na implementação da função, estamos recebendo um ponteiro. Agora vamos criar uma matriz e ARR, em seguida, iguais, e vamos dar a ele dez valores. Então 12345678910. Agora, para passar um endereço para essa função, podemos fazer isso usando a matriz. Como já mencionamos. Já mencionamos que a matriz ou matriz de dez é basicamente da mesma forma que chamar o primeiro elemento dentro dessa matriz. Então, para chamar o endereço do primeiro elemento, precisamos passá-lo usando ARR sem escrever mais nada. Agora, isso garantirá que o funk receberá o endereço do primeiro elemento. E isso aumentará esse endereço usando RTP subscrito aqui. Então, ele fará um loop do primeiro elemento para o último elemento e verá isso em ação. Vamos salvar isso e voltar. Agora, arrays GCC, ponteiros. Vamos ver. Agora, como você pode ver, temos um problema aqui, que é o fato de eu não estar definido. Então, vamos defini-lo. Mais uma vez. Agora. Como você pode ver, acabamos de imprimir a matriz sem ter que passar o valor dessa matriz. 12345678910. E só passamos o endereço do primeiro elemento dessa matriz. Usamos o operador subscrito de ponteiro para percorrer esse array simplesmente movendo de um endereço para o outro, para o próximo, aumentando um, o PTR usando esse diesel ou o operador subscrito. Sei que as coisas podem ser um pouco confusas neste momento, mas com este exemplo, você precisa dar uma olhada rapidamente neste exemplo novamente. Tente assistir a esta lição mais de uma vez para digerir as informações dentro dela. Agora, vamos fazer um resumo rápido. O nome da matriz é o endereço de seu primeiro elemento. Então, se tivermos esse array, então ARR aqui é o endereço da matriz 0. Agora, se você passar o nome da matriz ou similar neste caso para esta função, então você está passando o endereço para o final. A função. O protótipo deve ser declarado com um ponteiro como entradas. Agora, dentro da função func, quando desreferenciamos o PTR, então estamos acessando o primeiro elemento da matriz. E podemos acessar o primeiro elemento escrevendo PDR, último para acessar o segundo elemento. Ou podemos simplesmente usar o RTP. E aqui estamos usando subscrito ou para I. E estamos começando com o primeiro elemento endereçado. Em seguida, o segundo elemento, o terceiro elemento adiciona. E eu estou dizendo aqui, eu só, porque estamos lidando com endereços, não estamos lidando com valores, porque acabamos de receber o endereço do primeiro elemento e estamos fazendo loop através dos endereços. E estamos imprimindo o valor para o qual esses endereços estão apontando. É isso. Este não é um exemplo fácil, eu sei. Mas, novamente, os operadores ou digamos que os ponteiros não são uma coisa fácil de aprender. É por isso que você precisa assistir a esta lição mais uma vez para digerir as informações dentro dela. Se você tiver alguma dúvida ou se alguma coisa não estiver clara nesta lição, pergunte e a mandíbula, ficarei mais do que feliz em ajudar. Obrigado por assistir. 8. 9 Folheto selvagem e ponteiros nulos: Olá e seja bem-vindo a esta nova lição em que vamos falar sobre ponteiro pendurado e ponteiros selvagens. Um ponteiro pendente aponta para um endereço de memória que costumava conter um valor valioso. Como o endereço para o qual ele aponta não é mais preservado, usá-lo levará a um resultado esperado. Então, para ver isso em ação. Agora, aqui, o primeiro passo é criar um ponteiro. Então, n asterix PTR. Agora, o que precisamos fazer é usar a função malloc. Esta função malloc retornará vazio. Então, precisamos lançar para um asterisco inteiro, que é o ponteiro para inteiro para converter o ponteiro vazio em ponteiro inteiro. Então volte aqui e escreva um inteiro, que é basicamente um ponteiro inteiro. Agora prossiga com o modelo e precisamos chamar o tamanho da função. E resolveremos o tamanho do inteiro dentro aqui. Depois de fazer isso, criaremos uma variável, chamaremos de e a tornaremos igual a 560. Então precisamos fazer o ponto ou apontar para o endereço de a. Em seguida, usaremos essa função livre. A função simplesmente desalocará a memória. Então, certo, seja RTP. É isso. Agora, liberamos esse ponteiro. Já mencionamos que o ponteiro pendente aponta para um endereço de memória que é usado para manter a variável. Como o endereço para o qual ele aponta não é mais reservado, o uso dele levará a resultados inesperados. Agora, para mostrar o resultado inesperado, podemos fazer o seguinte. Fizemos a alocação do RTP. Assim, podemos escrever PTR igual a cinco para armazenar cinco dentro desse VTR de desreferência, que é a. E a última etapa é a impressão. Então imprima f. E aqui usaremos porcentagem d para planejar a referência do RTP. Agora vamos salvar o código. E aqui estamos testando ponteiro pendurado. Então volte, CLS, GCC. Ok, agora você vê ponteiros pendurados c, k. Agora temos um problema. Esquecemos de incluir um CD ao vivo. Então, vamos incluí-lo. Salvei o código e volte. Mais uma vez. Aqui estamos nós. Agora, como você pode ver aqui, nós compilamos esse código. Agora, vamos executá-lo um EXE. E como você pode ver, está piscando. Agora não recebemos nada. Ele deveria ter impresso essas diferentes frentes do RTP. Mas, como já mencionamos, desalocamos o RTP. Portanto, este é um ponteiro pendente e usá-lo após a alocação resultará em resultados inesperados. Isso é o que é um ponteiro pendente. Novamente, um ponteiro pendente é um ponteiro que aponta para excluí-lo ou os objetos alocados. E você precisa ter certeza de que não rastreie esses cenários. E tente evitá-los. Tente não brincar com ponteiros. Eles os alocam ou os excluem sem saber o que você está fazendo. Agora, o segundo tipo de ponteiros são os ponteiros selvagens. Agora, vamos comentar essa parte. Enquanto o ponteiro é um ponteiro usado antes da inicialização. Um exemplo disso é esse RTP final. Se usarmos a instrução print f e tentarmos imprimir PTR usando o PTR de desreferência. Ainda não inicializamos o RTP com um endereço. Então, isso é chamado de ponteiro de tempo. Agora salve seus códigos, volte e combine e, em seguida, execute. Como você pode ver, novamente, um resultado inesperado porque este é o nosso ponteiro. Não inicializamos esse ponteiro. E é por isso que estamos enfrentando isso. Agora. Sem setas desenhadas, mas não recebemos nenhum resultado porque. Este ponteiro não foi inicializado para começar. Agora, como transformar um ponteiro válido em outro? Então, enquanto ponteiro, é fácil. Como você pode ver, já criamos o ponteiro, então precisamos fazer com que ele aponte para alguma coisa. Podemos inicializá-lo simplesmente criando outro inteiro, chamá-lo, dar-lhe um valor de dez. Então diremos que o RTP será igual ao endereço de x. é isso. E agora podemos executar esse código novamente. Como você pode ver, temos cinco, que é o valor de x. E isso agora não é um ponteiro selvagem. Então, tivemos que inicializar o ponteiro para torná-lo não um ponteiro selvagem. E é basicamente assim que é feito. Então, vamos comentar essa parte e vamos falar sobre outro tipo de ponteiros, que é um ponteiro nulo. Agora, para garantir que não temos nosso endpoint ou podemos inicializar um ponteiro com analogia, tornando-o um ponteiro nulo. A maneira mais fácil de fazer isso é simplesmente copiando esse PTR asic final, que é a inicialização do ponteiro. E então você conta o conhecimento certo. É isso. Isso é chamado de ponteiro nulo. Agora também podemos imprimir esse ponteiro. Mãos. Você pode ver agora que estamos jogando, imprimindo, mas não está imprimindo nada porque é um ponteiro nulo e um ponteiro vazio. ponteiro nulo aponta para nada ou para o endereço de memória que os usuários não podem acessar. Então, neste caso, isso é chamado de ponteiro antigo. Então, vamos chamar esse vinho. Vamos chamar isso de pendurado, e vamos chamar esse ponteiro nulo. Agora, outro tipo de ponteiros é o ponteiro vazio. Um ponteiro vazio pode ser usado para apontar para uma variável de qualquer tipo de dados. Ele pode ser reutilizado para apontar para qualquer tipo de dados que quisermos. E é declarado facilmente escrevendo ponto asterix vazio ou PTR é igual a nulo. Isso é chamado de ponteiro vazio, uma vez que eles são de natureza muito geral, eles também são conhecidos como ponteiros genéricos. Com sua flexibilidade, ponteiros vazios também trazem algumas restrições. Os ponteiros vazios não podem ser desreferenciados como nenhum outro ponteiro. Agora, se você tentar desreferenciar um ponteiro vazio, você acabará enfrentando um erro. Se você estiver procurando realizar operações aritméticas em ponteiros vazios, então você precisa digitar lançar esses ponteiros. Agora, o typecasting é basicamente outro tópico e não vamos abordá-lo aqui. Mas você precisa digitá-lo se for usá-lo e operações aritméticas, anular ponteiros de grandes funções da biblioteca Hughes e C, como malloc e calloc, que alocam drasticamente memória retornou ponteiros vazios. Há também a fonte de matiz e a função de classificação embutida em C que tem uma função como argumento, que por si só toma ponteiros vazios como argumento. Agora, estes vêm principalmente o ponteiro vazio, o ponteiro nulo, o ponteiro selvagem e o ponteiro pendurado geralmente vêm e as perguntas da entrevista e as perguntas do MCQ. Então você precisa ter certeza de que você tem todas essas inflamações anotadas em um caderno para que você possa revisá-las quando precisar. E você não precisa memorizar todos eles, mas precisa saber exatamente o que cada um deles está fazendo. Agora, vamos fazer uma revisão rápida. Um ponteiro pendurado. O primeiro é um ponteiro que aponta para excluí-lo ou o objeto alocado. O ponteiro selvagem, que é o segundo, é qualquer ponto ou que é usado antes da inicialização. Agora, para torná-lo não um ponteiro selvagem, podemos fazer isso simplesmente usando o ponteiro nulo. E o último em nossa lista é chamado de ponteiro vazio, que é um ponteiro que pode ser usado para apontar para uma variável de qualquer tipo de dados. Ele também pode ser usado para apontar para qualquer tipo de dados que desejamos usar. Ele é declarado simplesmente digitando vazio antes do nome do ponteiro e do sinal de asterix e dando-lhe um valor nulo. É isso para esta lição. Obrigado por assistir.