(int *) (&a[2]) 和 *(&a[2]) 之间的区别
difference between (int *) (&a[2]) and *(&a[2])
我很难理解两者之间的区别:(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
。
- int(c) 和 c-'0' 之间的区别。C++
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 在 C 和 C++ 中作为函数参数,int **a 和 int a[][] 之间有什么确切的区别
- 在 C/C++ 中将数组作为形式参数作为 int arr[] 和 int arr[N] 传递的区别
- int x_ 和 int x 在C++中有什么区别
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- int (%d) 和 %.0lf 之间有什么区别?
- 打印一个带有静态 int 的函数,有一个 std::cout 和多个 std::cout 有什么区别?
- 有什么区别 - 常量 int x = 5000;和常量整数 x = 50'00;在C++?
- 杀死幻数:"const int" vs "constexpr int"(或者最后没有区别)
- uniform_int_distribution <>和 <int>有什么区别?
- “int*[1]”和“int(*)[1]”有什么区别
- std::vector<int> 和 std::vector* 有什么区别<int>?
- "auto x = vector<int>()"和"vector<int> x"有什么区别?
- int '*p = new int (5);' 和 'int *p = new int[5];' 有什么区别?
- C++ 中的 "int a, b =0" 和 "int a =0; int b = 0" 有什么区别?
- const int const&和const int&in C++有什么区别?
- "long int a=2"和"int a=2L"有什么区别?
- "long"和"long int"以及"long long"与"long long int"有什么区别