Passagem por referência

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);
}
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.

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);
}

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

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

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=???????;

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.