讲解C++编程中Address-of运算符&的作用及用法

所属分类: 软件编程 / C 语言 阅读数: 60
收藏 0 赞 0 分享

语法

& cast-expression

备注
一元 address-of 运算符 (&) 采用其操作数的地址。address-of 运算符的操作数可以是函数指示符,也可以是指定不是位域且不使用 register 储存类说明符声明的对象的左值。
address-of 运算符仅适用于具有基本、结构、类或在文件范围级别声明的联合类型的变量,或仅适用于下标数组引用。在这些表达式中,可在 address-of 表达式中添加或提取不包括 address-of 运算符的常数表达式。
当应用于函数或左值时,该表达式的结果将是派生自操作数类型(右值)的指针类型。例如,如果操作数的类型为 char,则表达式的结果为指向 char 的类型指针。address-of 运算符(应用于 const 或 volatile 对象)的计算结果为 const type * 或 volatile type *,其中 type 是原始对象的类型。
在将 address-of 运算符应用于限定名时,结果将取决于 qualified-name 是否指定静态成员。如果是这样,则结果为指向成员声明中指定的类型的指针。如果该成员不是静态的,则结果为指向由 qualified-class-name 指示的类的成员 name 的指针。
以下代码段说明了结果的不同之处,取决于该成员是否为静态的:

// expre_Address_Of_Operator.cpp
// C2440 expected
class PTM {
public:
      int  iValue;
  static float fValue;
};

int main() {
  int  PTM::*piValue = &PTM::iValue; // OK: non-static
  float PTM::*pfValue = &PTM::fValue; // C2440 error: static
  float *spfValue   = &PTM::fValue; // OK
}

在此示例中,由于 fValue 是静态成员,因此表达式 &PTM::fValue 产生类型 float * 而不是类型 float PTM::*。
仅当明确要引用的函数的版本时,才能采用重载函数的地址。有关如何获取特定重载函数的地址的信息,请参阅重载函数的地址。
通过将 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.
  double& rd = d; // Define a reference to the object.

  // Obtain and compare their addresses
  if( &d == &rd )
   cout << "&d equals &rd" << endl;
}

Output

&d equals &rd

以下示例使用 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 ) {
  return (*n) * (*n);
}

int main() {
  int mynum = 5;
  cout << square( &mynum ) << endl;  // pass address of int
}

Output

25

更多精彩内容其他人还在看

利用C语言来求最大连续子序列乘积的方法

这篇文章主要介绍了利用C语言来求最大连续子序列乘积的方法,基本的思路以外文中还附有相关ACM题目,需要的朋友可以参考下
收藏 0 赞 0 分享

用C语言判断一个二叉树是否为另一个的子结构

这篇文章主要介绍了用C语言判断一个二叉树是否为另一个的子结构,是数据结构学习当中的基础知识,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现的阶乘,排列和组合实例

这篇文章主要介绍了C语言实现的阶乘,排列和组合的方法,涉及C语言数学运算的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言查找数组里数字重复次数的方法

这篇文章主要介绍了C语言查找数组里数字重复次数的方法,涉及C语言针对数组的遍历与判断技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言简单实现计算字符个数的方法

这篇文章主要介绍了C语言简单实现计算字符个数的方法,涉及C语言针对字符串的简单遍历与判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

c实现linux下的数据库备份

本文给大家简单介绍下c实现linux下的数据库备份的方法和具体的源码,十分的实用,有需要的小伙伴可以参考下。
收藏 0 赞 0 分享

C++获得文件状态信息的方法

这篇文章主要介绍了C++获得文件状态信息的方法,包括文件状态信息、文件所在磁盘盘符、文件创建时间、访问时间及修改日期等,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言按关键字搜索文件夹中文件的方法

这篇文章主要介绍了C语言按关键字搜索文件夹中文件的方法,涉及C语言文件操作及字符串查找的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

C语言之字符串模糊查询方法的实现

本篇文章主要为大家介绍字符串模糊查询的C语言程序编写方法,有需要的朋友可以参考下
收藏 0 赞 0 分享

C语言实现BMP转换JPG的方法

这篇文章主要介绍了C语言实现BMP转换JPG的方法,涉及C#图片格式转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享
查看更多