retorno de ponteiro [RESOLVIDO]

1. retorno de ponteiro [RESOLVIDO]

Ameba
Ameba

(usa Debian)

Enviado em 17/01/2022 - 16:52h

fala pessoal, bl?
então estava dando uma estudada em retorno de função, até que vi uma aula sobre retorno de função com ponteiro.
exemplo:

#include <stdio.h>
#include <stdlib.h>
void recebe(int *num){
*num = *num * 2;

}
int main(){
int send=15;
printf("%d\n", recebe(&send));

return EXIT_SUCCESS;
}


mas o problema é que esse codigo não compila, e eu não sei o que pode ser, não sei se isso pode ser incompatibilidade tambem
porque eu uso linux, meu professor usa windows


  


2. MELHOR RESPOSTA

Adriano Siqueira
adrisiq

(usa KDE Neon)

Enviado em 17/01/2022 - 21:59h

Ameba, você está misturando (e confundindo) o uso de ponteiros com o retorno de funções. Uma função só pode ser colocada dentro de um printf se ela retornar algum valor (afinal precisa imprimir alguma coisa, né?). Como a sua função não retorna nada, ou seja, ela é void, então não pode ser colocada no printf.

Segundo ponto, sua função recebe um ponteiro e o resultado da operação fica armazenado no endereço de memória do próprio ponteiro. Dessa forma, assim que esse resultado for atribuído, a variável lá na função main vai ter o resultado alterado (afinal, é o mesmo endereço de memória, mas agora com um valor diferente). Diante disso, você só precisa imprimir a variável e verá o novo valor.

Veja seu código com alguns comentários:
#include <stdio.h>
#include <stdlib.h>

void funcao(int *ponteiro){
// O resutado fica armazanado no endereco do proprio ponteiro
*ponteiro = *ponteiro * 2;
}

int main(){
int variavel = 15;

// Passa o endereco de memoria da variavel
// A funcao nao retorna nada, entao nao pode chamar dentro do printf
funcao(&variavel);

// Como o resultado esta no endereco da variavel
// apenas exibimos o valor dela
printf("%d\n", variavel);

return EXIT_SUCCESS;
}


3. Re: retorno de ponteiro [RESOLVIDO]

Samuel Leonardo
SamL

(usa XUbuntu)

Enviado em 17/01/2022 - 18:03h


Ameba escreveu:

fala pessoal, bl?
então estava dando uma estudada em retorno de função, até que vi uma aula sobre retorno de função com ponteiro.
exemplo:

#include <stdio.h>
#include <stdlib.h>
void recebe(int *num){
*num = *num * 2;

}
int main(){
int send=15;
printf("%d\n", recebe(&send));

return EXIT_SUCCESS;
}


mas o problema é que esse codigo não compila, e eu não sei o que pode ser, não sei se isso pode ser incompatibilidade tambem
porque eu uso linux, meu professor usa windows

O retorno de toda função em C é declarado a esqierda do nome da função:
TIPO_RETORNO nomeFuncao( parametros)
Exemplo:
int soma(int a, int b){
return a + b;//função retorna um inteiro
}
void somaComPonteiro(int a, int b, int *resultado) {
*resultado = a + b;//soma a + b no endereço de resultado
//esta função não retorna nada, veja o void (vazio) dela
}

Quando uma função é clerada sem ser como void, significa que ela faz algo e então retorna um valor:
int soma(int a, int b) // vai retornar a soma de a e b
void somaEImprime(int a, int b)//vai somar e imprimir o resultado na saída

Por tanto, aquele seu printf("%d\n", recebe(&send)); está errado porque a função "recebe" não retorna nada, ela apenas faz uma operação interna no parâmetro send.
void recebe(int *num){
//apenas usa o valor do endereço de num e multiplica por 2 e então salva em num novamente
*num = *num * 2;
//não retorna nada
}



4. Re: retorno de ponteiro [RESOLVIDO]

Ameba
Ameba

(usa Debian)

Enviado em 17/01/2022 - 23:04h


adrisiq escreveu:

Ameba, você está misturando (e confundindo) o uso de ponteiros com o retorno de funções. Uma função só pode ser colocada dentro de um printf se ela retornar algum valor (afinal precisa imprimir alguma coisa, né?). Como a sua função não retorna nada, ou seja, ela é void, então não pode ser colocada no printf.

Segundo ponto, sua função recebe um ponteiro e o resultado da operação fica armazenado no endereço de memória do próprio ponteiro. Dessa forma, assim que esse resultado for atribuído, a variável lá na função main vai ter o resultado alterado (afinal, é o mesmo endereço de memória, mas agora com um valor diferente). Diante disso, você só precisa imprimir a variável e verá o novo valor.

Veja seu código com alguns comentários:
#include <stdio.h>
#include <stdlib.h>

void funcao(int *ponteiro){
// O resutado fica armazanado no endereco do proprio ponteiro
*ponteiro = *ponteiro * 2;
}

int main(){
int variavel = 15;

// Passa o endereco de memoria da variavel
// A funcao nao retorna nada, entao nao pode chamar dentro do printf
funcao(&variavel);

// Como o resultado esta no endereco da variavel
// apenas exibimos o valor dela
printf("%d\n", variavel);

return EXIT_SUCCESS;
}


Era isso mesmo, obrigado