c ++:使用指针访问缓冲区与使用增量变量

c++: using a pointer to access a buffer vs using an incremental variable

我正在写一个基于循环缓冲区的延迟。这是我的实现。

#include <iostream>

using namespace std;

int main() {
    cout << "Fixed delay with circular buffer" << endl;
    int dtime = 5;
    int buffersize = 10;
    auto *in = new int[buffersize];
    auto *del = new int[dtime];
    auto *out = new int[buffersize];
    int p = 0;
    // zero-initialise the delay line
    for (int i = 0; i < dtime; i++) {
        del[i] = 0;
    }
    // fill the in buffer
    for (int i = 0; i < buffersize; i++) {
        in[i] = i;
    }

    // apply delay
    for (int i = 0; i < buffersize; i++) {
        // read
        out[i] = del[p];
        // write
        del[p] = in[i];
        // update pointer
        p = (p != dtime-1? p+1 : 0);
    }

    for (int i = 0; i < buffersize; i++) {
        cout << out[i] << ' ';
    }

    delete[] in;
    delete[] out;
    delete[] del;

    return 0;
}

这是结果:0 0 0 0 0 0 1 2 3 4

阅读 this book,作者为 writing/reading 操作实现了一个指向延迟线的指针。这意味着,我必须使 p 指向延迟线的头部,即 int *p = del 并在访问延迟线时取消引用指针,即 out[i] = del[*p] 用于读取和 del[p] = in[i]为写操作。最后,我像以前一样更新值。

但是,我得到了这个结果:8 9 0 0 0 0 0 0 0 0。此外,如果我检查指针内的值,我会得到这个级数 0 1 2 3 4 0 6 7 8 9,这很奇怪。 我试图理解为什么会出现这种行为,因为我希望这两个版本是相同的。

为了完整性,我还附上了带有指针的版本。

#include <iostream>

using namespace std;

int main() {
    cout << "Fixed delay with circular buffer" << endl;
    int dtime = 5;
    int buffersize = 10;
    auto *in = new int[buffersize];
    auto *del = new int[dtime];
    auto *out = new int[buffersize];
    int *p = del;
    // zero-initialise the delay line
    for (int i = 0; i < dtime; i++) {
        del[i] = 0;
    }
    // fill the in buffer
    for (int i = 0; i < buffersize; i++) {
        in[i] = i;
    }

    // apply delay
    for (int i = 0; i < buffersize; i++) {
        cout << *p << ' ';
        // read
        out[i] = del[*p];
        // write
        del[*p] = in[i];
        // update pointer
        *p = (*p != dtime-1? *p+1 : 0);
    }

    for (int i = 0; i < buffersize; i++) {
        cout << endl << out[i] << ' ';
    }

    delete[] in;
    delete[] out;
    delete[] del;

    return 0;
}

您没有正确处理指针。 *p 替换了原始代码中的 del[p] 操作。

out[i] = *p;
*p = in[i];

"update pointer" 代码然后需要更新指针,而不是它指向的值。

p = p != &del[dtime - 1] ? p + 1 : del;

if (++p == &del[dtime])
    p = del;