Passagem por referência

6 respostas
F

Não estou conseguindo fazer uma passagem e alterar os valores de umas variáveis, o valor continua imprimindo 0 na tela, segue código conceitual:

#include <stdio.h>

int a1=0;
int a2=0;

int passagem(int *a) {
   return a=1;
}

int main() {
   passagem(&a1);
   passagem(&a2);
   printf("%i",a1);
   printf("%i",a2);
}

6 Respostas

K
return a=1;

Você está atribuindo o valor 1 ao ponteiro a que é um parâmetro.

A solução é atribuir o valor 1 ao inteiro que é referenciado pelo ponteiro: *a = 1

Ative os warnings de seu compilador, se tivesse ativo já saberia do problema. Acho que Clang até gera erro em lugar de warning. Mas se não avisar mude de compilador.

F

Isso funcionou, porém se eu passar mais de um parâmetro em minha função não funciona, o segundo valor é 0, no caso do exemplo abaixo o “b=2”.

#include <stdio.h>

int a1=0;
int b1=0;
int a2=0;
int b2=0;

int passagem(int *a, int *b) {
   return *a=1;
   return *b=2;
}

int main() {
   passagem(&a1, &b1);
   passagem(&a2, &b2);
   printf("%i %i",a1,b2);
   printf("%i %i",a2,b2);
}
K

O comando return tem a seguinte forma geral: return valor_de_retorno; ou return;

Digamos que uma função está sendo executada. Quando se chega a uma declaração return a função é encerrada imediatamente e, se o valor de retorno é informado, a função retorna este valor.

http://mtm.ufsc.br/~azeredo/cursoC/aulas/c720.html

F

Tem razão, eu deveria fazer return *a=1, *b=2;
Agora deu certo, obrigado pela ajuda.

F

Me ajuda com mais uma coisa?

Nesse meu exemplo aí, deixando uma variavel global junto com as a1, a2… chamamos ela de char nome[20]

como eu faço pra alterar essa cadeia de caracteres dentro da minha função com o return? Eu iria retornar assim:

return *a1=1, *a2=2, *nome=???????;

K

Não faz isso rsrs

Você pode ter mais de uma linha no procedimento.

int passagem(int *a, int *b) {
   *a=1;
   *b=2;
   return *a;
}

Isso caso for necessário realmente retornar alguma coisa. Caso não for é só declarar teu procedimento como retornando void, ou seja, muda para void passagem(int *a, int *b) { e remove o return.

Leia sobre arrays:
https://translate.google.com/translate?sl=en&tl=pt&js=y&prev=_t&hl=en&ie=UTF-8&u=http%3A%2F%2Fwww.cplusplus.com%2Fdoc%2Ftutorial%2Fntcs%2F&edit-text=&act=url

Recomendo que arranje algum livro ou tutorial bom de C, e leia de inicio a fim fazendo exercícios, etc.

Criado 15 de junho de 2017
Ultima resposta 23 de jun. de 2017
Respostas 6
Participantes 2