C++数组指针如何具有不同的位置,但指向同一个元素?

C++数组指针如何具有不同的位置,但指向同一个元素?,c++,arrays,pointers,pointer-arithmetic,C++,Arrays,Pointers,Pointer Arithmetic,我知道保存数组的变量存储数组的地址,并且对其进行任何索引都会对其执行指针算法。当我复习基础知识时,我发现了这一点 int main() { int equal; char c[] = {'a', 'b', 'c'}; char* p = c; char* q = &c[0]; cout<<*p<<endl; cout<<*q<<endl; cout<<&p<

我知道保存数组的变量存储数组的地址,并且对其进行任何索引都会对其执行指针算法。当我复习基础知识时,我发现了这一点

int main() {
    int equal;
    char c[] = {'a', 'b', 'c'};

    char* p = c;
    char* q = &c[0];

    cout<<*p<<endl;
    cout<<*q<<endl;
    cout<<&p<<endl;
    cout<<&q<<endl;
    if (c==q) {
        equal=1;
    }
    cout<<equal<<endl;
}

//output
a
a
0x7ffda22e0a60
0x7ffda22e0a68
1

p,q给了我相同的值,但是p,q的地址不同。这是怎么可能的?

分配数组时,将数组分配给的变量指向该数组的开头。该数组的开头是内存中的一个地址

数组开头的地址是它的第一个元素的地址,所以不管您是否使用char*x=arr;或char*y=&arr[0];它们将是一样的

现在x和y被分配到堆栈上,并且是两个不同的变量,因此它们将有不同的地址。因此

&x == &y // false

写入T*x时,您声明了一个指向T类型对象的指针。该指针x本质上是一个整数值,包含一个表示内存中地址的数字。

分配数组时,您将数组分配给的变量指向该数组的开头。该数组的开头是内存中的一个地址

数组开头的地址是它的第一个元素的地址,所以不管您是否使用char*x=arr;或char*y=&arr[0];它们将是一样的

现在x和y被分配到堆栈上,并且是两个不同的变量,因此它们将有不同的地址。因此

&x == &y // false

写入T*x时,您声明了一个指向T类型对象的指针。该指针x本质上是一个整数值,包含一个表示内存中地址的数字。

代码的图形表示:地址是虚构的


p和q是独立的变量,它们有自己的地址。但是,它们指向的地址是相同的。

代码的图形表示:地址是虚构的


p和q是独立的变量,它们有自己的地址。但是,他们所指的地址是相同的。

这与:我怎样才能在两张纸上写下我的家庭地址,而两张纸上的家庭地址却保持不变?这与:我怎样才能在两张纸上写下我的家庭地址,而两张纸上的家庭地址却保持不变?