Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Skep

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

Recommended Posts

Postado (editado)

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.

Editado por Skep
  • 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
Postado (editado)

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

Editado por Skep
  • 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






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

×