Warum die Adresse eines Array-Elements wie "& myArray [i]" übernehmen? Zweidimensionales Array

Sep 14 2020

Es gibt einen Code, in dem ein Float-Array wie folgt erstellt wird:

mData = new float[channelCount * maxFrames];

dann tut es

memcpy(&mData[sampleIndex],
                   buffer,
                   (numSamples * sizeof(float)));

Was heißt &mData[sampleIndex]das Nun, wir haben ein Float-Array, wir nehmen ein Element dieses Arrays und dann die Adresse dieses Elements. Wäre die Adresse dieses Elements nicht mData + sampleIndex?

Was ist, wenn ich memcpydurch eine for-Schleife ändern wollte ? Ich habe das gemacht und es hat funktioniert:

            for (int i=0; i< numSamples * sizeof(float); i++) {
                (&mData[sampleIndex])[i] = buffer[i];
            } 

aber ich weiß nicht was (&mData[sampleIndex])[i]bedeutet. Sollte es sein mData + sampleIndex + i?

Dieser Code soll dazu dienen, Mikrofon-WAV-Daten aufzuzeichnen, sodass wir in der Lage sein sollten, Dinge in mehreren Kanälen zu speichern. Wie verwaltet dieser Code solche Kanäle?

Antworten

2 eerorika Sep 15 2020 at 00:15

Was bedeutet & mData [sampleIndex]? Nun, wir haben ein Float-Array, wir nehmen ein Element dieses Arrays und dann die Adresse dieses Elements. Wäre die Adresse dieses Elements nicht mData + sampleIndex?

Ja.

Was ist, wenn ich memcpy durch eine for-Schleife ändern wollte?

Ihre Schleife macht nicht ganz das Gleiche. memcpykopiert numSamples * sizeof(float)Bytes, während Ihre Schleife numSamples * sizeof(float)Floats kopiert . Da ein Float (auf den meisten Systemen) aus mehreren Bytes besteht, kann dies zu einem Pufferüberlauf führen.

aber ich weiß nicht was (& mData [sampleIndex]) [i] bedeutet. Sollte es mData + sampleIndex + i sein?

Es ist nicht ganz dasselbe. (&mData[sampleIndex])[i]wäre gleich*(mData + sampleIndex + i)

Wie verwaltet dieser Code solche Kanäle?

Dieser Code kopiert einfach Werte von einem Array in ein anderes. Es "verwaltet" nichts.

1 RemyLebeau Sep 15 2020 at 00:06

Die Syntax array[index]ist die gleiche wie folgt *(array + index):

&mData[sampleIndex]

ist das gleiche wie:

&(*(mData + sampleIndex))

Welches ist einfach:

mData + sampleIndex

Und so (&mData[sampleIndex])[i]wird ein float*Zeiger auf das mDataElement am Index abgerufen sampleIndexund dann der Index iauf diesen Zeiger angewendet. Also ja, in diesem Fall:

(&mData[sampleIndex])[i] = buffer[i];

ist das gleiche wie:

*(mData + sampleIndex + i) = *(buffer + i);