(int *)(& a [2])和*(& a [2])之间的差异

时间:2015-07-16 00:41:19

标签: c++ pointers

我无法理解两者之间的区别:(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;
}

4 个答案:

答案 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;

演示:http://coliru.stacked-crooked.com/a/c95796c19750400b

答案 2 :(得分:3)

* dereference a pointer

(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