Seus conteudos são ótimos!! Uso como dicionario da minha faculdade 🤣
@thiagoleonheart1769 Жыл бұрын
Super Aula. Valeu
@gal-zki3 жыл бұрын
Muito obrigado! Finalmente entendi
@programeseufuturo3 жыл бұрын
Por nada Pedro e que bom que entendeu :)
@thalesk.99613 жыл бұрын
Obrigadoo, finalmente consegui entender isso :)
@programeseufuturo3 жыл бұрын
Por nada. Que bom que ajudou :) Abraços e bons estudos.
@sabrona10 ай бұрын
oh professor pf tira esse fundo preto, mal dá pra ver
@luis_schizo6 ай бұрын
da pra ver sim
@rmelojefferson3 жыл бұрын
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.
@programeseufuturo3 жыл бұрын
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; }