Mengapa mengambil alamat elemen array seperti `& myArray [i]`? Array dua dimensi

Sep 14 2020

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

2 eerorika Sep 15 2020 at 00:15

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.

1 RemyLebeau Sep 15 2020 at 00:06

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);