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

沒有必要,因爲你傳遞變量,做的位置變化的地址從函數返回任何在調用可見函數

相關問題