C语言有无变量接收形参

问题遇到的现象和发生背景
int func(int a)
{
    a = 20;
    return a;
}
int func1(int a)
{
    a = 20;
    return a;
}
void test()
{
    int a = 10;
    func(a);
    printf("a = %d\n", a);

void test1()
{
    int a = 10;
    int b = 0;
    b = func1(a);
    printf("b = %d\n", b);
}
int main()
{
    test();
    test1();
    return 0;
}

运行结果及报错内容

a = 10
b = 20

我想要达到的结果

这两种不都是值传递吗?为什么在实参中有值接收形参的返回值时,test0就可以改变实参的值。
他不应该和test一样吗?