如果我传递一个变量的地址,我是否必须执行 return?

If I pass an address of a variable do I have to do a return?

如果我有一个根据某些规则递增 global 变量的函数,并且我通过引用传递一个变量,我必须执行 return 还是会无论如何都要更新变量?这也适用于局部变量吗?例如:

static uint8_t counter = 1;

void add(uint8_t *variable)
{
   if (*variable == 5)
   {
    *variable = 7;

   } else if (*variable == 20)
   {
    *variable = 1;
   } else
   {
    *variable++;
   }
}

我在某处调用 'add' 函数,例如:

void function(void)
{
... some code...
add(&counter);
... some code...
}

避免全局变量。

如果您确实必须使用全局变量,则根本不需要传递它 - 您可以直接修改它,即您既不需要传递也不需要 return 它。

static uint8_t counter = 1;

void add(void)
{
   if (counter == 5) {
    counter = 7;
   } else if (counter == 20) {
    counter = 1;
   } else {
    counter++;
   }
}

如果您使用的是现有接口 add(),该接口需要同时适用于全局变量和一些从函数传递的局部变量。 那么你现有的函数就可以了,你不需要 return 任何东西,因为你是你想要修改和更新其内容的变量的地址。

对于全局(文件范围)变量,您根本不需要将其显式传递给函数。它已经在全局范围内并且可以从所有函数(块范围)访问,提供你在本地(内部)范围内没有另一个同名的本地标识符。

也就是说,对于 到点 的回答,不,您不需要 return 更新值,它已经反映在 实际参数 (counter) 传递给函数。这对于全局范围和非全局范围变量都是相同的。

全局变量在您的文件中具有可见性,因此您将其地址传递给的函数是已知的。

当全局变量在函数中可见时,为什么需要指针?

您可以只更改它的值,并且更改后的值在调用函数中可见。

如果您的问题是针对非全局变量的,那么

    void func(int *q);   

    int main()
    {
       int a;
       func(&a);
       printf("%d \n",a);
    }

    void func(int *q)
    {
       *q = 10;
    }

不需要 return 函数中的任何内容,因为您正在传递变量的地址,并且对位置所做的更改在调用函数中可见

此代码适用于任何类型的变量,无论它是全局变量还是局部变量,因为对象是通过引用传递的。

然而,更好的接口是当函数 returns 它作为参数获得的指针时。

uint8_t * add(uint8_t *variable)
{
   if (*variable == 5)
   {
    *variable = 7;

   } else if (*variable == 20)
   {
    *variable = 1;
   } else
   {
    *variable++;
   }

  return variable;
}

在这种情况下,您可以组合调用该函数或将其与等待同一指针的其他函数一起使用。例如

add( add( &counter ) );

SomeOtherFunction( add( &counter ) );

在多线程环境下调用函数时存在差异,全局变量没有存储 class 说明符 _Thread_local。