Curso de Programação C | Entendendo aritmética de ponteiros com vetor | Aula 189

  Рет қаралды 4,964

Programe seu futuro

Programe seu futuro

Күн бұрын

Пікірлер: 10
@gabrielsanguinette5032
@gabrielsanguinette5032 Жыл бұрын
Seus conteudos são ótimos!! Uso como dicionario da minha faculdade 🤣
@thiagoleonheart1769
@thiagoleonheart1769 Жыл бұрын
Super Aula. Valeu
@gal-zki
@gal-zki 3 жыл бұрын
Muito obrigado! Finalmente entendi
@programeseufuturo
@programeseufuturo 3 жыл бұрын
Por nada Pedro e que bom que entendeu :)
@thalesk.9961
@thalesk.9961 3 жыл бұрын
Obrigadoo, finalmente consegui entender isso :)
@programeseufuturo
@programeseufuturo 3 жыл бұрын
Por nada. Que bom que ajudou :) Abraços e bons estudos.
@sabrona
@sabrona 10 ай бұрын
oh professor pf tira esse fundo preto, mal dá pra ver
@luis_schizo
@luis_schizo 6 ай бұрын
da pra ver sim
@rmelojefferson
@rmelojefferson 3 жыл бұрын
Bom dia, professor! Se puder, gostaria de tirar algumas dúvidas a respeito do comportamento do código abaixo: 1 #include 2 #include 3 4 void preencher(int vet[], int a) { 5 int i = 0; 6 7 for(i = 0; i < 5; i++) { 8 *vet = a; 9 vet++; 10 } 11 } 12 13 void imprimir(int vet[]) { 14 int i; 15 16 printf(" "); 17 for (i = 0; i < 5; i++) { 18 printf("[%d]: %d\tEndereço: %p ", i+1, vet[i], &vet[i]); 19 } 20 } 21 22 int main() { 23 int vet[5] = {0}, a = 1; 24 25 for(i = 0; i < 5; i++) { 26 *vet = a; 27 vet++; 28 } 29 30 imprimir(vet); 31 preencher(vet, a); 32 imprimir(vet); 33 34 return 0; 35 } É um exercício do livro linguagem C completa e descomplicada, que pede para fazer uma função que preencha o vetor com o valor de uma outra varíavel do mesmo tipo sem usar um índice para percorrer o vetor. Está funcionando, mas inicialmente eu fiz um teste colocando o laço que está dentro da função preencher() direto na função main, mas o compilador apontou o erro - error: lvalue required as increment operand e eu não entendi por qual motivo ele apresenta esse comportamento dentro de main, mas funciona dentro da função preencher. E uma outra dúvida é que eu tentei imprimir o vetor direto da função preencher() após o termino do primeiro laço, mas ele imprime outros dados, com outros valores e outros endereços.
@programeseufuturo
@programeseufuturo 3 жыл бұрын
Olá Jefferson. Interessante suas perguntas. Elas estão relacionadas. Vou começar pela segunda: 1) "E uma outra dúvida é que eu tentei imprimir o vetor direto da função preencher() após o termino do primeiro laço, mas ele imprime outros dados, com outros valores e outros endereços." Exato e isso acontece porque você realizou uma aritmética de ponteiro na sua variável vet. Para facilitar imagine que os endereços do seu vetor vão de 1 a 5. A variável vet é um ponteiro e aponta para o endereço 1. Cada incremento que você faz em um ponteiro faz ele apontar para a posição seguinte. Assim, ao preencher o vetor, quando você inseriu o último elemento e fez o incremento em seguida, o ponteiro vet passou a apontar para a região de memória de endereço 6, que não pertence mais ao seu vetor. Aí, quando você chama imprimir dentro de preencher passando o ponteiro vet, ele não aponta mais para o endereço 1, mas para o endereço 6. Como resolver isso? Simples, dentro da função preencher, faça um ponteiro auxiliar receber o valor de vet (perceba que é o valor de vete, o endereço guardado em vet e não o conteúdo para onde ele aponta) e trabalhe sempre com o ponteiro auxiliar. Assim, você consegue voltar para o início do vetor fazendo o ponteiro auxiliar receber vet novamente quando for necessário. void preencher(int vet[], int a) { int i = 0; int *p = vet; // ponteiro auxiliar recebe o endereço guardado em vet for(i = 0; i < 5; i++) { *p = a; p++; } p = vet; printf(" Impressão dentro da função prencher: "); imprimir(p); // ou a versão abaixo //printf(" Impressão dentro da função prencher: "); //imprimir(vet); } 2) "inicialmente eu fiz um teste colocando o laço que está dentro da função preencher() direto na função main, mas o compilador apontou o erro - error: lvalue required as increment operand e eu não entendi por qual motivo ele apresenta esse comportamento dentro de main, mas funciona dentro da função preencher." Ele funciona dentro da função preencher porque lá na função você está manipulando uma cópia da variável vet (o primeiro endereço do vetor) e não o vet original que está na função main. A linguagem C trabalha apenas com passagem de parâmetros por valor, então, quando você chama a função preencher(vet, a) é feito uma cópia de vet e uma cópia de a e a função vai trabalhar com essas copias. Por outro lado, na função main, quando você tenta fazer uma aritmética de ponteiro diretamente na variável vet o compilador não deixa e por que ele faz isso? Simples! Se você alterar seu ponteiro original você perde seu vetor na memória, você não consegue mais voltar para o início, então ele bloqueia qualquer operação que altere o valor de vet na função main. Como resolver isso? A solução é exatamente a mesma sugerida acima. Faça um ponteiro auxiliar receber o valor de vet e trabalhe com o ponteiro auxiliar. Como é uma cópia, não há problema alterar seu valor pois o original está preservado. int main() { int vet[5] = {0}, a = 1, i; int *p = vet; for(i = 0; i < 5; i++) { *p = a; p++; } imprimir(vet); preencher(vet, a); imprimir(vet); return 0; }
Curso de Programação C | Como criar um ponteiro para struct? | Aula 190
10:27
Мен атып көрмегенмін ! | Qalam | 5 серия
25:41
Don’t Choose The Wrong Box 😱
00:41
Topper Guild
Рет қаралды 59 МЛН
Tuna 🍣 ​⁠@patrickzeinali ​⁠@ChefRush
00:48
albert_cancook
Рет қаралды 135 МЛН
Programação em C - 12 - Aritmética de Ponteiros
14:11
Professor Rafael Ivo
Рет қаралды 3,2 М.
Aprenda ponteiros de uma vez por todas
10:40
Judson Santiago
Рет қаралды 8 М.
Entendendo de vez ponteiros e alocação dinâmica em C/C++ #01
8:56
Hércules Moreira
Рет қаралды 9 М.
Ponteiros e matrizes dinâmicas em C
26:58
Programe seu futuro
Рет қаралды 7 М.
Linguagem C | Aula 55 - Ponteiros: Conceitos
8:54
Programação Descomplicada | Linguagem C
Рет қаралды 66 М.
Estruturas de Dados 1 - #8 Ponteiros: Exercícios
13:51
xavecoding
Рет қаралды 6 М.
Ponteiros em C: Ponteiro Para Ponteiro
13:47
Eduardo Casavella
Рет қаралды 23 М.