Ir ao conteúdo
  • Cadastre-se
Skep

C VOID - O que exatamente significa "não voltar valor" ?

Recommended Posts

Todo mundo fala que diferença de void para as outras é que ela não voltar valor mas se fazer uma função assim:

 

void Iniciar(int vet[],int vet2[]){
    int i;
    for(i=0; i<10; i++){
        vet = 9+1;
    }
    for(i=0;i<10;i++){
        vet2 = 9+1;
    }    
}

 

As 10 posições dos dois vetores serão armazenados com 10, e depois de sair da função ainda irão ter esse valor. Isso não significa "voltar valor" ou o que realmente significa esse negocio de "voltar valor" ? Até agora só vi void sendo usada pra imprimir algo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
35 minutos atrás, Skep disse:

Todo mundo fala que diferença de void para as outras é que ela não voltar valor mas se fazer uma função assim:

 

void Iniciar(int vet[],int vet2[]){
    int i;
    for(i=0; i<10; i++){
        vet = 9+1;
    }
    for(i=0;i<10;i++){
        vet2 = 9+1;
    }    
}

 

As 10 posições dos dois vetores serão armazenados com 10, e depois de sair da função ainda irão ter esse valor. Isso não significa "voltar valor" ou o que realmente significa esse negocio de "voltar valor" ? Até agora só vi void sendo usada pra imprimir algo.

 

Sim, nesse caso está retornando valor, mas está retornando através de uma variável passada por referência como parâmetro da função, no caso o parâmetro é um vetor de inteiros chamado vet (vetores sempre são passados por referência).

 

O tipo da função só é usado quando retorna-se valor usando a palavra reservada return.

 

Para ficar mais claro, veja esse post meu explicando para que serve o tipo da função, e quando ele deve ser void:

 

Qualquer coisa poste a dúvida que ainda tiver e tentarei explicar.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@isrnick Então isso só é possivel porque é um vetor ? Então só ocorre com vetor ?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
agora, Skep disse:

Então isso só é possivel porque é um vetor ? Então só ocorre com vetor ?

 

Não, você também pode passar por referência variáveis normais.

 

Ou mais especificamente, no caso de uma variável normal, você deve usar & antes do nome da variável para obter a referência/endereço de memória onde os valores desta variável são armazenados, então ao invés de passar uma cópia do valor guardado, você passa o endereço de memória onde o valor está.

 

Note que você já faz isso frequentemente quando usa scanf(), pois está passando para o scanf() o endereço de memória onde o valor da variável é guardado (não o valor guardado na variável), assim quando fizer alterações no valor desse endereço dentro da função scanf() estará de fato alterando o valor desta variável fora da função (do mesmo modo que ocorre no caso de vetores).

 

Na função a variável do parâmetro deverá ser um tipo especial de variável chamado ponteiro, que é identificada colocando um asterisco entre o tipo da variável e o nome dela (ex: int *ponteiro), e ponteiros servem para guardar endereços de memória, e dizemos que "um ponteiro aponta para um endereço de memória". Então a função pode guardar valores no lugar da memória apontado por este ponteiro e em efeito estará alterando o valor da variável cuja referência foi passada para a função.

adicionado 36 minutos depois

Exemplos:

 

void func1(int d){
    //O valor de d é alterado na função
    //mas nada é retornado.
    d = d * 2;
}

//Note que o tipo int da função bate com
//o tipo de valor retornado com return:
int func2(int c){
    //Altera o valor de c:
    c = c * 2;
    //E retorna o valor resultante:
    return c;
}

void func3(int *p){
    //Altera o valor do lugar da memória
    //apontado pelo ponteiro, logo altera
    //a variável do escopo onde a função
    //foi chamada.
    *p = *p * 2;
    //Logo, o retorno é feito através da
    //própria variável parâmetro da função.
}

int main(){
    int x = 10;
    
    //Passa uma cópia do valor de x para a função,
    //e o que acontece na função não afeta x.
    func1(x);
    //x ainda é igual a 10 quando a função acaba.
    
    //Passa uma cópia do valor de x para a função,
    //e a função retorna o dobro de x.
    x = func2(x);
    //O valor 20 foi retornado pela função e 
    //atribuído a variável x.
    
    //Passa a referência/endereço de memória da
    //variável x para a função, a função altera
    //o valor neste lugar da memória, alterando
    //o valor de x.
    func3(&x);
    //x tem valor 40 quando a função acaba.
  
    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×