2017-02-14 28 views
0

我正在學習關於擴展USB控件的代碼,並且我遇到了下面這段代碼。該函數反轉數組的順序。除了一件事外,它非常簡單。爲什麼代碼不會破壞數組?使用源和目標作爲相同的變量應該腐敗它,不是嗎?爲什麼這個數組沒有被弄髒?

/* 
* Convert a array of bytes from big endian to little endian and vice versa by inverting it 
*/ 
static 
uint8_t *raw_inv(uint8_t *data, int size) { 

    int ai = 0; 
    int bi = size - 1; 
    uint8_t a = 0; 
    uint8_t b = 0; 

    while (ai < bi) { 
     a = data[ai]; 
     b = data[bi]; 

     data[ai] = b; 
     data[bi] = a; 
     ai++; 
     bi--; 
    } 

    return data; 
} 

啊:這是'靜態'聲明,不是嗎?

+1

它在哪裏使用源和目標作爲相同的變量? (該函數的「靜態」聲明不應該影響複製。) –

回答

1

它使用ab作爲臨時值來保存它正在交換的值。只有one temporary is needed - 可以改寫爲:

while (ai < bi) { 
    a = data[ai]; 
    data[ai] = data[bi]; 
    data[bi] = a; 
    ai++; 
    bi--; 
} 
+0

哦,我明白了。哇。這真的很明顯。我以爲他們一次只寫一個地方,但他們真的在交換地點。 – Raydude

相關問題