1

如果我有一个函数按照某个规则递增global变量,并且我通过引用传递一个变量,是否必须执行返回或将变量更新吗?这是否也适用于局部变量?例如:如果我传递一个变量的地址,我必须做一个返回?

static uint8_t counter = 1; 

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

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

而且我所说的 '添加' 功能类似的地方:

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

也许我这样做是不正确的一般,有一个更好的方式去做这件事...... – NitrogenAir

+0

如果你有一个全局(但'静态')变量,并且'add'函数是在同一个翻译单元,为什么要首先通过一个论点? –

+0

看来你实际上正在传递指针的值(不是由ref),尽管这段代码通常没什么意义。如果这个变量是全局的,你就不需要传递它。另外,可能有两个add中的解除引用是不必要的。 – George

回答

2

此代码可以与任何类型的变量一起使用,无论它是全局变量还是本地变量,因为该对象是通过引用传递的。

但是,更好的接口是函数返回它作为参数获取的指针。

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

当调用该函数时在多线程环境和全局变量没有在存储类说明_Thread_local存在差异。

1

避免全局变量。

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

static uint8_t counter = 1; 

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

如果您使用的是需要两个全局变量和函数的推移,一些局部变量工作现有接口add()。 然后你现有的功能是好的,你不需要返回任何东西,因为你是要修改和更新其内容的变量的地址。

+0

是的,虽然我使用的是全局变量,但我希望能够将它与局部变量一起使用。我知道我只需传递一个变量的值并返回一个递增的值,但使用指针似乎更有效。 – NitrogenAir

+0

我确实认为这是其中一种可能性。这就是为什么我添加了最后一段。在这种情况下,你的函数是好的,并且适用于本地和全局变量。事实上,就函数add()而言,对象的生命周期是无关紧要的 - 它只会更新你传递它的任何东西。但是如果你碰巧有多个线程并且可能将'counter'的地址传递给各种函数(或者在多个线程中使用'counter'的值),请注意* data race *。 – usr

0

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

这就是说,对于一个给点回答,不,你并不需要返回更新后的值,它已经体现在实际参数counter)传递给函数。这对于全局范围变量和非全局范围变量都是一样的。

0

全局变量在整个文件中都具有可见性,所以它已知您要传递其地址的函数。

为什么当函数内部全局变量可见时需要指针?

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

如果你的问题是,对于非全局变量则

void func(int *q); 

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

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

没有必要,因为你传递变量,做的位置变化的地址从函数返回任何在调用可见函数

相关问题