Warum die Adresse eines Array-Elements wie "& myArray [i]" übernehmen? Zweidimensionales Array
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
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.
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);