references
语法
1. 取地址运算符 &
又称 address-of 运算符 &
一元 address-of 运算符 (&) 返回其操作数的地址(即指针)。 返回指针!!!
address-of 运算符的操作数可以是函数指示符,也可以是引用非位字段对象的 lvalue。
& 是一元运算符,返回操作数的内存地址。例如,如果 var 是一个整型变量,则 &var 是它的地址。该运算符与其他一元运算符具有相同的优先级,在运算时它是从右向左顺序进行的。
您可以把 & 运算符读作"取地址运算符",这意味着,&var 读作"var 的地址"。
2. 间接寻址运算符 *
一元间接寻址运算符 (*) 取消引用指针;即它将指针值转换为一个 lvalue。 间接寻址运算符的操作数必须是指向类型的指针。 间接寻址表达式的结果是从中派生指针类型的类型。
如果操作数指向函数,则结果是函数指示符。
如果它指向存储位置,则结果是指定存储位置的左值。
间接寻址运算符 ,它是 & 运算符的补充。 是一元运算符,返回操作数所指定地址的变量的值。 返回的是地址上的变量值!!!
示例
1. 可以累计使用间接寻址运算符来取消引用指向指针的指针
// expre_Indirection_Operator.cpp
// compile with: /EHsc
// Demonstrate indirection operator
#include <iostream>
using namespace std;
int main() {
int n = 5;
int *pn = &n; //int类型指针pn 指向 变量n的地址,&返还地址
int **ppn = &pn; //。。。依托大便 个人感觉没啥意义,指向指针的指针ppn 该指针指向 pn指针的地址
cout << "Value of n:\n"
<< "direct value: " << n << endl
<< "indirect value: " << *pn << endl //解析pn指向的地址上的值
<< "doubly indirect value: " << **ppn << endl
<< "address of n: " << pn << endl //指针指向的地址
<< "address of n via indirection: " << *ppn << endl;
}
2. 静态成员的地址
以下代码段说明了 address-of 运算符结果的不同之处,取决于类成员是否为静态的:
// expre_Address_Of_Operator.cpp
// C2440 expected
class PTM {
public:
int iValue;
static float fValue;
};
int main() {
//&PTM::fValue 是静态成员,因此表达式 float * 产生类型 float PTM::* 而不是类型 fValue
int PTM::*piValue = &PTM::iValue; // OK: non-static
float PTM::*pfValue = &PTM::fValue; // C2440 error: static
float *spfValue = &PTM::fValue; // OK
}
3. 引用类型的地址
通过将 address-of 运算符应用于引用类型,可获得与将该运算符应用于引用绑定到的对象所获得的结果相同的结果。 例如:
// expre_Address_Of_Operator2.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
int main() {
double d; // Define an object of type double.
//使用&的引用型变量,引用的是该地址上的该变量值。改rd的话d也会跟着变化
double& rd = d; // Define a reference to the object.
// Obtain and compare their addresses
if( &d == &rd ) //比较两者地址
cout << "&d equals &rd" << endl; //输出: &d equals &rd
}
4. 函数地址作为参数
以下示例使用 address-of 运算符将指针自变量传递给函数:
// expre_Address_Of_Operator3.cpp
// compile with: /EHsc
// Demonstrate address-of operator &
#include <iostream>
using namespace std;
// Function argument is pointer to type int
int square( int *n ) { //这里是声明指针类型的变量n
return (*n) * (*n); //这里的*n返回的是数值
}
int main() {
int mynum = 5;
//作为函数的参数的时候,返还的是地址
cout << square( &mynum ) << endl; // pass address of int,输出是:25
}
4. 示例
#include <iostream>
using namespace std;
int main ()
{
int var;
int *ptr;
int val;
var = 3000;
// 获取 var 的地址
ptr = &var;
// 获取 ptr 的值
val = *ptr;
cout << "Value of var :" << var << endl;
cout << "Value of ptr :" << ptr << endl;
cout << "Value of val :" << val << endl;
return 0;
}
Value of var :3000
Value of ptr :0xbff64494
Value of val :3000