Mengapa mengambil alamat elemen array seperti `& myArray [i]`? Array dua dimensi
Ada beberapa kode yang membuat float array seperti ini:
mData = new float[channelCount * maxFrames];
lalu itu terjadi
memcpy(&mData[sampleIndex],
buffer,
(numSamples * sizeof(float)));
Apa &mData[sampleIndex]maksudnya Nah, kita memiliki array mengambang, kita mengambil elemen dari array itu, dan kemudian mengambil alamat dari elemen itu. Bukankah alamat elemen itu mData + sampleIndex?
Bagaimana jika saya ingin mengubahnya memcpydengan for loop? Saya melakukan ini dan berhasil:
for (int i=0; i< numSamples * sizeof(float); i++) {
(&mData[sampleIndex])[i] = buffer[i];
}
tapi saya tidak tahu apa (&mData[sampleIndex])[i]artinya. Haruskah demikian mData + sampleIndex + i?
Kode ini seharusnya berfungsi untuk merekam data microfone wav, jadi kami harus dapat menyimpan berbagai hal di banyak saluran. Bagaimana kode ini mengatur saluran seperti itu?
Jawaban
Apa yang dimaksud & mData [sampleIndex]? Nah, kita memiliki array mengambang, kita mengambil elemen dari array itu, dan kemudian mengambil alamat dari elemen itu. Bukankah alamat elemen itu mData + sampleIndex?
Iya.
Bagaimana jika saya ingin mengubah memcpy dengan for loop?
Lingkaran Anda tidak melakukan hal yang sama. memcpysedang menyalin numSamples * sizeof(float)byte saat loop Anda menyalin numSamples * sizeof(float)float. Karena float terdiri dari beberapa byte (pada kebanyakan sistem), ini dapat menyebabkan buffer overflow.
tapi saya tidak tahu apa artinya (& mData [sampleIndex]) [i]. Haruskah mData + sampleIndex + i?
Ini tidak persis sama. (&mData[sampleIndex])[i]akan sama dengan*(mData + sampleIndex + i)
Bagaimana kode ini mengatur saluran seperti itu?
Kode ini hanya menyalin nilai dari satu larik ke larik lainnya. Itu tidak "mengatur" apa pun.
Sintaksnya array[index]sama dengan *(array + index), jadi:
&mData[sampleIndex]
sama dengan:
&(*(mData + sampleIndex))
Yang sederhananya:
mData + sampleIndex
Jadi, (&mData[sampleIndex])[i]mendapatkan float*pointer ke mDataelemen di index sampleIndex, dan kemudian menerapkan indeks ike pointer itu. Jadi ya, dalam hal ini:
(&mData[sampleIndex])[i] = buffer[i];
sama dengan:
*(mData + sampleIndex + i) = *(buffer + i);