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.