关于#c++##new#的问题,如何解决?

麻烦帮我看看下面两篇代码,(我先声明了一个数组buffer,然后在数组的开始位置new了一块存放N个double的内存空间并返回给指针p1,然后继续在buffer偏移N个double的位置new了一块存放N个double类型的内存空间并返回地址给p2,最后打印所有的地址)唯一的区别就是buffer数组一个是char类型一个是double(或者int)类型,为什么只有是char类型的时候p1和p2两个数组的地址是连续的,其他类型的时候都不连续(第一块内存空间和第二块内存空间不连续)。

#include 
#include 

using namespace std;

const int BUF = 512;
const int N = 5;
char buffer[BUF];


int main(void)
{
    double *p1, *p2;
    p1 = new(buffer)double[N];
    p2 = new(buffer + N * sizeof(double))double[N];
    for (int i = 0; i < N; i++)
    {
        cout << &p1[i] << endl;
    }
    
    cout << endl;
    
    for (int i = 0; i < N; i++)
    {
        cout << &p2[i] << endl;
    }

    return 0;
}

/*运行结果
0x1000080a0
0x1000080a8
0x1000080b0
0x1000080b8
0x1000080c0

0x1000080c8
0x1000080d0
0x1000080d8
0x1000080e0
0x1000080e8
Program ended with exit code: 0
*/
#include 
#include 

using namespace std;

const int BUF = 512;
const int N = 5;
double buffer[BUF];


int main(void)
{
    double *p1, *p2;
    p1 = new(buffer)double[N];
    p2 = new(buffer + N * sizeof(double))double[N];
    for (int i = 0; i < N; i++)
    {
        cout << &p1[i] << endl;
    }
    
    cout << endl;
    
    for (int i = 0; i < N; i++)
    {
        cout << &p2[i] << endl;
    }

    return 0;
}

/*运行结果
0x1000080a0
0x1000080a8
0x1000080b0
0x1000080b8
0x1000080c0

0x1000081e0
0x1000081e8
0x1000081f0
0x1000081f8
0x100008200
Program ended with exit code: 0
*/

因为要符合系统默认对齐数,你可以参考这里说的对齐和默认对齐数的概念 https://blog.csdn.net/wd1603926823/article/details/129003849