Em 2020 agradecendo e parabenizando por um vídeo de 2013 (rsrs), mas essa foi a melhor explicação que ouvi (principalmente a parte do benefício do uso de ponteiros). Realmente uma visão de Aluno para Aluno. Que Deus continue te abençoando.
Excelente vídeo! Gostei bastante dessa explicação no final, apesar de eu gostar de abstração, não faz mal entender o propósito das coisas, sem ser num sentido mais de você ter a possibilidade de fazer algo.
Muito bom meu amigo. Agora o uso de ponteiros faz sentido para mim. Muito obrigado. Vou compartilhar teu canal entre os meus amigos e recomendar sempre que alguém tiver alguma dificuldade.
Cara, melhor vídeo aula de programação que eu já vi, só gostaria de perguntar o porque de você ter criado o ponteiro *pteste, apontando para variável teste, pois o endereço da variável teste poderia ter sido passado para a função sem esse intermediário.
sei que todas essas funções são usadas no dia-a-dia da vida de programador, mais na hora do aprendizado por mais entenda o assunto fico achando que um dia posso precisar e não dar conta
Em 0:27 quando se diz: "... criamos uma 'FUNÇÃO' chamada teste ..." não seria: criamos uma 'VARIÁVEL' chamada teste? Fiquei um pouco confuso. Quando declaro uma variável posso tbm chamá-la de função? Obrigado.
+Ramon Giovane Mais ou menos isso ramon, so que escrevendo ++x ele incrementa e depois atribui e x++ ele atribui e depois incrementa, em um for por exemplo cada qual iria se comportar de maneira diferente.
Olá, estou com uma grande duvida depois dessa aula, ótima por sinal. Mas então, durante este semestre na faculdade recebi o desafio de desenvolver um programa que por meio de funções, em uma delas, substitui-se os valores repetidos de um vetor(vetor este com os valores entrados pelo usuário) por zero, e em outra função, substitui-se os valores negativos, também por zero. Ai que vem a duvida, os valores alterados pela função de substituir os negativos(que no sequencia vinha antes do dos repetidos) eram mantidos como zero na hora de serem imprimidos após a função de substituir os repetidos. As funções não deveriam criar copias do vetor? Já testei de varias maneiras, usando os printf's dentro das próprias funções, usando eles fora, e a única maneira de não serem mantidas as alterações foi criando um vetor2 que no inicio do programa recebe os valores do vetor original. Sei que a duvida não tem a ver com ponteiros, mas espero que possa responde-la e que tenha deixado bem claro a mesma. Demonstrado interesse pela duvida ficarei feliz em compartilhar o programa em questão. Desde já obrigado.
Passei por Algoritmos e Programação II com C e APANHEI O QUANTO É POSSÍVEL em ponteiros e ainda mais em ponteiros de ponteiros. Agora entrarei em Estrutura de Dados, resolvi dar uma revisada e queria ter visto isso na época de AlgProgII. E sim, provavelmente vou apanhar ainda mais em Estrutura de Dados, mas pelo menos vi esses vídeos skfkdkd
@@GabrielSilva-sj2hf faça isso amigo, tranquei esse ano por causa de problemas com a pandemia e logística, e agora to com um puta medo quando retornar pra lá em 2023
a gente entende a funçao prmiordial de ponteiros quando pensamos que os computadores da epoca que alinguagem c foi criada tinham no maximo 8 ou 16 klobytes de memoria. ao inves de 4 gb dos que temos disponiveis hoje...
Nesse caso deu certo, porque as funções estão abaixo do Main, nem precisava ele ter criado os protótipos. Agora, se ele colocasse a função antes do main, daria erro, os protótipos teriam que ser colocados fora do main, abaixo das bibliotecas.
Gosto muito das aulas. De aluno para aluno é mesmo muito bom. Só fiquei na dúvida aqui. Você disse que (int *pX) está apontando para o endereço. Certo, de certa forma sim, mas nesse caso aí seria para o valor nesse endereço em questão. Certo? Ou estou enganado? void testePonteiro(int *pX){ ++*pX; } Seguindo mais o vídeo entendi que a chamada que eu indaguei acima recebe o endereço da memória e então mostra o valor contido nela... Acho que é isso.
As 2 coisas meu amigo. Se voce colocar um * antes da variável do ponteiro, vc vai estar acessando o valor que ele esta apontando no endereço que este ponteiro esta armazenando. Agora, se vc nao colocar, vc nao coloca o *, ele aponta para o endereço.
Alguém sabe me dizer o que está errado no código abaixo? Era pra imprimir a matrícula do aluno, mas aparece o erro: "dereferencing pointer to incomplete type" void imprime(struct cadastro *a) { printf("%i",(*a).matricula); } int main() { setlocale(LC_ALL,""); struct cadastro{ char nome[80]; int matricula; float notas[2]; }aluno; int i; printf("Digite o nome do aluno: "); gets(aluno.nome); printf("Digite a matrícula do aluno: "); scanf("%i",&aluno.matricula); for(i = 0; i
eu to com um problema que nao entendi poderia me explicar typedef struct ELEMENTO{ int data; ELEMENTO* next; } typedef struct ESTRUTURA{ ELEMENTO* head; } ESTRUTURA *e; queria entender segunda struct e a variavel abaixo poderia me da uma luz
Professor, bom dia. Eu estou acompanhando suas aulas sobre ponteiros, porém, eu não entendi qual é a real utilidade dos ponteiros. Por exemplo, no código dessa aula. Você passou como parâmetro o endereço de memória da variável, então, em vez do programa criar uma cópia da variável, ele simplesmente altera diretamente o valor dentro do endereço de memória referente a tal variável. Até ai tudo bem. Porém, se eu criasse uma variável global não daria no mesmo? Por exemplo: #include //Variável Global int x = 1; void testeVariavel(){ ++x; } void testePonteiro(int *pX){ ++*pX; } int main(int argc, char **argv) { int *pTeste = &x; testeVariavel(x); printf("Global: %i ",x); //Voltei a variável para 1. Assim, consigo exemplificar que o valor será o mesmo, tanto com a global quanto com ponteiro x = 1; testePonteiro(pTeste); printf("Ponteiro: %i",x); getchar(); return 0; } Se você executar esse código o valor será 2 para ambos os caso, global e ponteiro. Nesse caso, seguindo sua explicação, eu não teria um consumo enorme de memória, pois eu teria somente uma variável criada e ao longo do programa eu poderia mudar o valor dela dentro da função sem ter a necessidade de cria-la novamente. Então essa é minha duvida. Afinal, qual a real utilidade do ponteiro? Eu sei que ele deve ter uma tremenda utilidade, porém, eu não consegui enxergar-la, ainda. Talvez eu tenho falado um monte de groselha, mas realmente tenho duvida quanto a isso. Desde já agradeço pela sua atenção e por todo o conhecimento compartilhado.
Num programa "de verdade" existem muitas variáveis, algumas são pertinentes por um script inteiro (ou mais de um), outras são usadas apenas ocasionalmente aqui e ali (tipo um int x aqui, um float somatorio ali...), não convém poluir o seu código tornando todas elas em variaveis globais, fora a questão da segurança e organização em ter variáveis com escopos restritos a apenas algumas funções específicas. E imagina se você quiser trabalhar com vetores dinâmicos? Vai criar uma variável global pra simular cada index do vetor? Enfim, ao menos em C, é mais organizado, seguro e limpo usar ponteiros do que transformar qq variavelzinha que você quiser alterar (com o nível de dinamismo do ponteiro) em uma global
Por que não fazemos assim?? int main() { int testeVariavel(int x); void testePonteiro(int *pX); int teste = 1; int *pTeste = &teste; testePonteiro(pTeste); printf("%i ", teste); printf("%i ", teste); getchar(); return 0; } int testeVariavel(int x){ ++x; return x; } void testePonteiro(int *pX){ ++*pX; }
Por que o mesmo não acontece com vetores? Ao passarmos um vetor, o valor do vetor original também é alterado! #include void testeVariavel (int x){ printf("\tx antes: %i ",x); ++x; printf("\tx depois: %i ",x); } void testePonteiro(int *pX){ printf("\tpX antes: %i ",*pX); ++*pX; printf("\tpX depois: %i ",*pX); } void testeVetor (int x[]){ printf("\tvetor x antes: %i ",x[0]); ++x[0]; printf("\tvetor x depois: %i ",x[0]); } int main() { int teste = 1; int *pTeste = &teste; int vteste[] = {1}; printf("teste antes: %i ",teste); testeVariavel(teste); printf("teste depois: %i
+Vinicius Getting Better Quando passamos vetor automaticamente ele vai como ponteiro; Ex int A[10]; O "A" armazena o primeiro endereço do vetor. Quando passa o vetor para a função. Ela entende como se voce tivesse passado *A com 10 posições.
Você pode passar simplesmente um ponteiro e alocar memoria para ele depois por exemplo int *vetor; funcao( vetor ); funcao( int *vetor ){ //decidimos que o tamanho vai ser 10 (pode variar o tamanho você quem escolhe) vetor = malloc( sizeof(int )* 10 ); }
Muito ruim, além de não usar cor fica tudo preto e ainda explica muito rápido, pra quem e lerdo e meio burro igual eu tem que rever o vídeo mais de uma vez, mas vlw pela ajuda. Da próxima usa cor e explica mais devagar. Obg!
Em 2020 agradecendo e parabenizando por um vídeo de 2013 (rsrs), mas essa foi a melhor explicação que ouvi (principalmente a parte do benefício do uso de ponteiros). Realmente uma visão de Aluno para Aluno. Que Deus continue te abençoando.
num sei unsa
mim insina!
LA ele
vc merece um premio nobel
Excelente vídeo! Gostei bastante dessa explicação no final, apesar de eu gostar de abstração, não faz mal entender o propósito das coisas, sem ser num sentido mais de você ter a possibilidade de fazer algo.
Ótima explicação. A gente sempre acha o que é um ponteiro, mas não para que e porque utilizá-lo. Parabéns pelo vídeo!
aula incrível com uma didática maravilhosa!
Nossa! Agora clareou tudo! Parabéns pelas aulas!
Por favor, faz mais aulas!!! Suas aulas são as melhores do TH-cam!
Estou no primeiro semestre de ADS, suas aulas estão sendo de grande ajuda!
Muito BOM!!! - Tão claro qto o Sol que brilha ao meio-dia.
Muito esclarecedora essa aula
perfeita aula, o professor explica muito bem, meus parabéns!
Parabéns pelas aulas, Ítalo! Elas nos ajudam muuuuito mesmo! Obrigado!
o assunto é confuso, mais o cara é fera de mais
Muito legal, estou começando a ver aplicação prática utilizando os ponteiros.
Muito bom meu amigo. Agora o uso de ponteiros faz sentido para mim.
Muito obrigado. Vou compartilhar teu canal entre os meus amigos e recomendar sempre que alguém tiver alguma dificuldade.
Muito esclarecedor.
gratidao por esse conteudo excelente🤩
Maravilha o canal ta me ajudando muito...
Excelente!!!!
Muito bom mano
Sensacional essa explicação!
Cara, melhor vídeo aula de programação que eu já vi, só gostaria de perguntar o porque de você ter criado o ponteiro *pteste, apontando para variável teste, pois o endereço da variável teste poderia ter sido passado para a função sem esse intermediário.
Acho que na pratica, os dois modos são usados.
Foi só para mostrar que vc pode alterar a var test através de uma var *pTeste e para traçar o paralelo entre as duas formas...
mto bom, rápido e objetivo!
Excelente as aulas, parabéns
Valeu cara !! me salvou!kk
te amo cara
Gay
Tenho uma curiosidade, em vários vídeos você está sempre criando o protótipo das funções dentro de main, por que não fora?
sei que todas essas funções são usadas no dia-a-dia da vida de programador, mais na hora do aprendizado por mais entenda o assunto fico achando que um dia posso precisar e não dar conta
Em 0:27 quando se diz: "... criamos uma 'FUNÇÃO' chamada teste ..." não seria: criamos uma 'VARIÁVEL' chamada teste? Fiquei um pouco confuso. Quando declaro uma variável posso tbm chamá-la de função? Obrigado.
Ele errou ao chamar a variável teste de função. Na verdade, é variável teste mesmo... pode confiar. :)
em breve ;)
Bom tarde
Ei fera, muito boas suas aulas. Qual é a diferença entre x++ e ++x ? VLW
+Victor Lima é a mesma coisa, escrita de maneira diferente: x++ ou ++x é o mesmo que x = x + 1;
+Ramon Giovane Mais ou menos isso ramon, so que escrevendo ++x ele incrementa e depois atribui e x++ ele atribui e depois incrementa, em um for por exemplo cada qual iria se comportar de maneira diferente.
+Gabriel Guimarães hmm... não sabia disso. Sempre uso variável++ :P
Vlw
+Victor Lima
x++ é o mesmo que x + 1
++x é o mesmo que 1 + x
em alguns casos isso pode fazer diferença
no ++x o 1 ele ja e adicionado ali na hora
no x++ ele so adiciona 1 a partir da proxima linha
Olá, estou com uma grande duvida depois dessa aula, ótima por sinal.
Mas então, durante este semestre na faculdade recebi o desafio de desenvolver um programa que por meio de funções, em uma delas, substitui-se os valores repetidos de um vetor(vetor este com os valores entrados pelo usuário) por zero, e em outra função, substitui-se os valores negativos, também por zero.
Ai que vem a duvida, os valores alterados pela função de substituir os negativos(que no sequencia vinha antes do dos repetidos) eram mantidos como zero na hora de serem imprimidos após a função de substituir os repetidos.
As funções não deveriam criar copias do vetor?
Já testei de varias maneiras, usando os printf's dentro das próprias funções, usando eles fora, e a única maneira de não serem mantidas as alterações foi criando um vetor2 que no inicio do programa recebe os valores do vetor original.
Sei que a duvida não tem a ver com ponteiros, mas espero que possa responde-la e que tenha deixado bem claro a mesma.
Demonstrado interesse pela duvida ficarei feliz em compartilhar o programa em questão.
Desde já obrigado.
Passei por Algoritmos e Programação II com C e APANHEI O QUANTO É POSSÍVEL em ponteiros e ainda mais em ponteiros de ponteiros. Agora entrarei em Estrutura de Dados, resolvi dar uma revisada e queria ter visto isso na época de AlgProgII. E sim, provavelmente vou apanhar ainda mais em Estrutura de Dados, mas pelo menos vi esses vídeos skfkdkd
Sobreviveu?
@@GabrielSilva-sj2hf rapaz... foi melhor que em AlgProgII. Apanhei mesmo foi em Sistemas Operacionais
@@grodo. comecei em agosto em sistemas de informações, já tô bem avançado, pretendo continuar nesse ritmo pra não ter muitos problemas.
@@GabrielSilva-sj2hf faça isso amigo, tranquei esse ano por causa de problemas com a pandemia e logística, e agora to com um puta medo quando retornar pra lá em 2023
@@grodo. entendi, vlw pelo conselho. Espero que consiga colocar as coisas no eixo.
Queria uma aula de Passagem de função como parâmetro para outra função
No caso ai, não precisava criar uma outra variável chamada pTeste. era só passar na função testePonteiro(&teste); que já enviaria o endereço de teste
cade a continuação de ponteiros e funçoes??
Chrome foi desenvolvido sem ponteiros 🤔 Procede? Kkkkkkk
nossa nunca pensei nisso kkkkkkkkk bem pensado
@@webpunisher2954 mintira
ele unsou portero
passagem por valor e referência mandou abraços ! kkkkkkkkk
Já vi o uso de flushs para limpar a memória nesses casos de ir usando muitos pedaços dela.
8 ponteiros sem noção n gostaram dessa obra-prima
a gente entende a funçao prmiordial de ponteiros quando pensamos que os computadores da epoca que alinguagem c foi criada tinham no maximo 8 ou 16 klobytes de memoria. ao inves de 4 gb dos que temos disponiveis hoje...
Nesse caso deu certo, porque as funções estão abaixo do Main, nem precisava ele ter criado os protótipos. Agora, se ele colocasse a função antes do main, daria erro, os protótipos teriam que ser colocados fora do main, abaixo das bibliotecas.
Gosto muito das aulas. De aluno para aluno é mesmo muito bom.
Só fiquei na dúvida aqui. Você disse que (int *pX) está apontando para o endereço. Certo, de certa forma sim, mas nesse caso aí seria para o valor nesse endereço em questão. Certo? Ou estou enganado?
void testePonteiro(int *pX){
++*pX;
}
Seguindo mais o vídeo entendi que a chamada que eu indaguei acima recebe o endereço da memória e então mostra o valor contido nela... Acho que é isso.
As 2 coisas meu amigo. Se voce colocar um * antes da variável do ponteiro, vc vai estar acessando o valor que ele esta apontando no endereço que este ponteiro esta armazenando. Agora, se vc nao colocar, vc nao coloca o *, ele aponta para o endereço.
Algum exemplo de ponteiro char?
cara, tô maratonando os vídeos, só assim consigo entender, tava osso
dedicado, meu xablau no seu quadrado
Alguém sabe me dizer o que está errado no código abaixo?
Era pra imprimir a matrícula do aluno, mas aparece o erro: "dereferencing pointer to incomplete type"
void imprime(struct cadastro *a)
{
printf("%i",(*a).matricula);
}
int main()
{
setlocale(LC_ALL,"");
struct cadastro{
char nome[80];
int matricula;
float notas[2];
}aluno;
int i;
printf("Digite o nome do aluno:
");
gets(aluno.nome);
printf("Digite a matrícula do aluno:
");
scanf("%i",&aluno.matricula);
for(i = 0; i
entendi bem , mais sempre fica aquele receio de que no dia que precisa não consegui fazer.
Irmao, seus videos são excelentes, porém o local que colocastes para passar ou retornar entre as aulas ficou inacessível.
eu to com um problema que nao entendi poderia me explicar
typedef struct ELEMENTO{
int data;
ELEMENTO* next;
}
typedef struct ESTRUTURA{
ELEMENTO* head;
}
ESTRUTURA *e;
queria entender segunda struct e a variavel abaixo poderia me da uma luz
passei um pointeiro assim: func( *teste); não aceitou mas se escrever func(char *)(teste)); aceita , porque?
Complicou um pouco rsrs -.-
Professor, bom dia. Eu estou acompanhando suas aulas sobre ponteiros, porém, eu não entendi qual é a real utilidade dos ponteiros. Por exemplo, no código dessa aula. Você passou como parâmetro o endereço de memória da variável, então, em vez do programa criar uma cópia da variável, ele simplesmente altera diretamente o valor dentro do endereço de memória referente a tal variável. Até ai tudo bem. Porém, se eu criasse uma variável global não daria no mesmo? Por exemplo:
#include
//Variável Global
int x = 1;
void testeVariavel(){
++x;
}
void testePonteiro(int *pX){
++*pX;
}
int main(int argc, char **argv) {
int *pTeste = &x;
testeVariavel(x);
printf("Global: %i
",x);
//Voltei a variável para 1. Assim, consigo exemplificar que o valor será o mesmo, tanto com a global quanto com ponteiro
x = 1;
testePonteiro(pTeste);
printf("Ponteiro: %i",x);
getchar();
return 0;
}
Se você executar esse código o valor será 2 para ambos os caso, global e ponteiro. Nesse caso, seguindo sua explicação, eu não teria um consumo enorme de memória, pois eu teria somente uma variável criada e ao longo do programa eu poderia mudar o valor dela dentro da função sem ter a necessidade de cria-la novamente. Então essa é minha duvida. Afinal, qual a real utilidade do ponteiro? Eu sei que ele deve ter uma tremenda utilidade, porém, eu não consegui enxergar-la, ainda. Talvez eu tenho falado um monte de groselha, mas realmente tenho duvida quanto a isso.
Desde já agradeço pela sua atenção e por todo o conhecimento compartilhado.
Num programa "de verdade" existem muitas variáveis, algumas são pertinentes por um script inteiro (ou mais de um), outras são usadas apenas ocasionalmente aqui e ali (tipo um int x aqui, um float somatorio ali...), não convém poluir o seu código tornando todas elas em variaveis globais, fora a questão da segurança e organização em ter variáveis com escopos restritos a apenas algumas funções específicas.
E imagina se você quiser trabalhar com vetores dinâmicos? Vai criar uma variável global pra simular cada index do vetor? Enfim, ao menos em C, é mais organizado, seguro e limpo usar ponteiros do que transformar qq variavelzinha que você quiser alterar (com o nível de dinamismo do ponteiro) em uma global
Resumindo a utilidade dos ponteiro é poupar muita memória, e fluidez na execução.
Por que não fazemos assim??
int main()
{
int testeVariavel(int x);
void testePonteiro(int *pX);
int teste = 1;
int *pTeste = &teste;
testePonteiro(pTeste);
printf("%i
", teste);
printf("%i
", teste);
getchar();
return 0;
}
int testeVariavel(int x){
++x;
return x;
}
void testePonteiro(int *pX){
++*pX;
}
Vish... Complicado hein..
complicado msm, por isso que a linguagem c depende muito de PRATICA
verdade..
Por que o mesmo não acontece com vetores? Ao passarmos um vetor, o valor do vetor original também é alterado!
#include
void testeVariavel (int x){
printf("\tx antes: %i
",x);
++x;
printf("\tx depois: %i
",x);
}
void testePonteiro(int *pX){
printf("\tpX antes: %i
",*pX);
++*pX;
printf("\tpX depois: %i
",*pX);
}
void testeVetor (int x[]){
printf("\tvetor x antes: %i
",x[0]);
++x[0];
printf("\tvetor x depois: %i
",x[0]);
}
int main() {
int teste = 1;
int *pTeste = &teste;
int vteste[] = {1};
printf("teste antes: %i
",teste);
testeVariavel(teste);
printf("teste depois: %i
",teste);
printf("teste antes: %i
",teste);
testePonteiro(pTeste);
printf("teste depois: %i
",teste);
printf("vteste antes: %i
",vteste[0]);
testeVetor(vteste);
printf("vteste depois: %i
",vteste[0]);
printf("
Se for vetor, o valor de vteste muda, mesmo nao utilizando um ponteiro...
");
return 0;
}
+Vinicius Getting Better Quando passamos vetor automaticamente ele vai como ponteiro;
Ex
int A[10];
O "A" armazena o primeiro endereço do vetor. Quando passa o vetor para a função. Ela entende como se voce tivesse passado *A com 10 posições.
Você pode passar simplesmente um ponteiro e alocar memoria para ele depois por exemplo
int *vetor;
funcao( vetor );
funcao( int *vetor ){
//decidimos que o tamanho vai ser 10 (pode variar o tamanho você quem escolhe)
vetor = malloc( sizeof(int )* 10 );
}
cara nao entendi nada"---->nada
aula Horrivel
Muito ruim, além de não usar cor fica tudo preto e ainda explica muito rápido, pra quem e lerdo e meio burro igual eu tem que rever o vídeo mais de uma vez, mas vlw pela ajuda. Da próxima usa cor e explica mais devagar. Obg!
claro, ele vai fazer uma video aula so pra vc que eh burro...