【问题标题】:How can C++ array pointers have different location, yet point to the same element?C++ 数组指针如何具有不同的位置,但指向同一个元素?
【发布时间】:2020-10-05 07:17:20
【问题描述】:

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

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 的地址不同。这怎么可能?

【问题讨论】:

  • 这相当于:我怎样才能在两张纸上写上我的家庭住址,同时让两张纸上的家庭住址保持不变?

标签: c++ arrays pointers pointer-arithmetic


【解决方案1】:

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

数组开头的地址就是它的第一个元素的地址,所以不管你取char *x = arr;还是char *y = &amp;arr[0];它们将是相同的。

现在xy 分配在堆栈上并且是两个不同的变量,因此它们显然会有不同的地址。因此

&x == &y // false

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多