C++ 数组指针如何具有不同的位置,但指向相同的元素?
How can C++ array pointers have different location, yet point to the same element?
我知道保存数组的变量存储数组的地址,并且对它的任何索引都会对其执行指针运算。当我复习基础知识时,这是我发现的。
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
本质上是一个整数值,包含一个代表内存中地址的数字。
代码的图示:(地址是虚构的)
p
和q
是独立的变量,它们有自己的地址。但是,它们指向的地址是相同的。
我知道保存数组的变量存储数组的地址,并且对它的任何索引都会对其执行指针运算。当我复习基础知识时,这是我发现的。
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
本质上是一个整数值,包含一个代表内存中地址的数字。
代码的图示:(地址是虚构的)
p
和q
是独立的变量,它们有自己的地址。但是,它们指向的地址是相同的。