2017-02-14 4 views
0

Ich studiere Code, um mehr über Extended USB Controls zu erfahren, und ich stieß auf diesen Code, der unten gezeigt wird. Die Funktion kehrt die Reihenfolge eines Arrays um. Es ist ziemlich einfach, bis auf eine Sache. Warum beschädigt der Code das Array nicht? Wenn Sie die Quelle und das Ziel als dieselbe Variable verwenden, sollten Sie sie verfälschen, oder?Warum wird dieses Array nicht verschmutzt?

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

Ah: Es ist die "statische" Erklärung, nicht wahr?

+1

Wo verwendet es die Quelle und das Ziel als die gleiche Variable? (Die "statische" Deklaration der Funktion sollte keinen Einfluss auf das Kopieren haben.) –

Antwort

1

Es verwendet a und b als Provisorien, um die Werte zu halten, die es austauscht. Nur one temporary is needed - dies könnte wie folgt umgeschrieben werden:

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

Oh, ich habe es verstanden. Beeindruckend. Es ist wirklich offensichtlich. Ich dachte, dass sie einen Ort zu einer Zeit schreiben würden, aber sie tauschen buchstäblich die Standorte aus. – Raydude

Verwandte Themen