(int *) (&a[2]) 和 *(&a[2]) 之间的区别

difference between (int *) (&a[2]) and *(&a[2])

本文关键字:区别 int 之间      更新时间:2023-10-16

我很难理解两者之间的区别:(int *) (&a[2])和*(&a[2])。我理解&a[2]获得a[2]的地址,*获得该地址中的值,因此*(&a[2])获得a[2]的值,即3。但是为什么(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;
}

*(&a[2])获取值a[2](一个简单的引用然后解引用)

(int*)(&a[2])获取a[2]的地址并将其转换为int*(无解引用)

(int*)不遵从指针,它将其强制转换为int*(这是多余的,因为它已经是int*)

注意: int*是一个类型,正如int是一个类型。

( int*)正在做c style casting。

以下3条语句将打印相同的结果,它们在示例的上下文中是等效的:

    cout << (int*)(&a[2]) << endl;
    cout << &a[2] << endl;
    cout <<static_cast<int*>( &a[2]) << endl;

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

* 将指针解引用

(int*) 是对int* 的c风格强制转换。


由于(&a[2])产生一个指向数字3的指针…

* (&a[2])将取消对指针的引用。

(int*) (&a[2])将指针强制转换为int指针。

第一个(*(&a[2]))说获得a索引2处的元素,获得指向该元素的指针(即内存中的地址)(&),然后获得该地址的值(*),因此本质上&*运算符相互抵消,得到a[2],即3。

第二个((int*)(&a[2]))说获取a索引2处的元素,获得指向该元素的指针(&),然后将该指针强制转换为int指针((int *))(即将该地址的值解释为整数)。因此,整个表达式将为您提供a[2]在内存中的地址,它恰好是0x7fff40144888