我无法理解两者之间的区别:(int *)(& a [2])和*(& a [2])。我理解& a [2]得到a [2]的地址,*得到该地址的值,所以*(& a [2])得到a [2]的值,即3。但是如何come(int *)(& a [2])返回一个地址?谢谢!
输出:
3
0x7fff40144888
代码:
include<iostream>
using namespace std;
int main()
{
int a[3]={1,2,3};
//cout << *(a+2) << endl;
cout << *(&a[2]) << endl;
cout << (int*)(&a[2]) << endl;
}
答案 0 :(得分:4)
*(&a[2])
获取值a[2]
(简单引用,然后取消引用)
(int*)(&a[2])
获取a[2]
的地址并将其转换为int *(无解除引用)
(int*)
不依赖于指针,它将其转换为int*
(这是多余的,因为它已经是int*
)
注意: int*
是一种类型,就像int
类型一样。
答案 1 :(得分:4)
( int*)
正在进行c样式转换。
以下3个语句将打印相同的结果,它们在您的示例的上下文中是等效的:
cout << (int*)(&a[2]) << endl;
cout << &a[2] << endl;
cout <<static_cast<int*>( &a[2]) << endl;
答案 2 :(得分:3)
(int*)
是int*
的C风格演员。
由于(&a[2])
生成指向数字3
...
* (&a[2])
将取消引用指针。
(int*) (&a[2])
会将指针强制转换为int
指针。 (它已经是 - 所以它没有效果)
答案 3 :(得分:1)
第一个(*(&a[2])
)表示获取a
索引2处的元素,获取指向该元素的指针(也就是内存中的地址)(&
),然后得到该地址的值(*
),所以基本上&
和*
运算符会取消,而a[2]
就是3。
第二个((int*)(&a[2])
)表示获取a
索引2处的元素,获取指向该元素的指针(&
),然后将该指针强制转换为int指针((int *)
)(即将该地址的值解释为整数)。因此,整个表达式将为您提供a[2]
的内存地址,恰好是0x7fff40144888
。