C++之反引用运算符 &和××
&是取地址符号,既取得某一个变量的地
址;如:&a
而* 是指针运算符(乘号就不说了),可
以表示一个变量是指针类型;也可以表示
一个指针变量的所指向的存储单元,可以
获取某个地址存储的值。
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
int a,*pa = &a
定义了整型变量a和一个指向整型数据的
指针变量pa,并定义pa是一个存放a的地址的变
量
TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
在C++中,有两个运算符我们很少用到,这两个运算符就是反引用运算符:->*和.*
下面介绍一下这反引用运算符的使用
在C++中,我们定义一个变量的指针可以这样:
int a = 5;
int *pA = &a;
然后,我们就可以使用pA来获得a的值。
而在C++中,我们定义函数指针大概是这样的:
void (*pFun)(int);
如果是定义一个函数指针类型,就是这样:
typedef void (*pFun_t)(int);如果我们有这样一个函数:
void fun(int i)
{
......
}
那么我们就可以这样
pFun_t pfun = fun;
然后就可以使用pfun来代替fun,下面是使用代码
#include <stdio.h>
void fun(int i)
{
printf("i = %d/n", i);
}
typedef void (*pFun_t) (int);
int main(int argc, char *argv[])
{
pFun_t pfun = fun;
pfun(2);
return 0;
}
说完C++中的普通变量的指针和函数指针后,我们来看看反引用运算符的用法
假设我们有一个类
class A
{
// ...
void fun(int i);
int num;
};
那么,我们又怎么定义类A中的这两个成员的指针呢,定义类的成员的指针是这样的:
void (A::*pFun)(int) = &A::fun;
int A::*pNum = &A::num;
我们看到成员变量指针的定义比普通变量指针和函数指针的定义多了域操作符A::。
那么我们定义完这些成员变量的指针后,就应该运用反引用运算符来使用这些成员变量指针了,我们先看这两个反引用运算符的用法:
->* :可以用类对象指针反引用成员指针。
.* :可以用类对象反引用成员指针。
其使用如下:
// ...
A *pA = new A;
(pA->*pFun)(2);
int a = pA->*pNum;
==============================================================>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
设有定义:int a,*pa = &a,以下scanf语句中能正确为变量a读入数据的是
A,scanf(“%d”,pa);
B,scanf(“%d”,a);
C,scanf(“%d”,&pa);
D,scanf(“%d”,*pa);
A[解析]scanf()函数的功能是进行输入数据,它是按格式参数的要求从终端上把数据传送到地
址参数所指定的内存空间中,C语言允许程序员间接地使用内存地址,这个地址是通过对变量名“求地址”运算得到的,求地址的运算符是&,得到的地址
是一种符号地址。本题中定义了整型变量a和一个指向整型数据的
指针变量pa,并定义pa是一个存放a的地址的变
量。选项B中应该将a改为&a;选项C应该将&pa改为pa,因为pa已经表示存放a的地
址;选项D中*pa表示的是指针
pa所指向存储空间的变量的值,而不是一个地址。
WHATWHATWHATWHATWHATWHATWHATWHATWHATWHATWHATWHAT
*是取值运算符,对地址使用可以获得地址中储存的数值;对于指针a,*a表示取a 中的值 &是地址运算符,对变量使用可以获得该变量的地址。 对于变量b,*b表示取 b的地址
在定义时,* 是一个标识符,声明该变量是一个指针,比如说int *p; 那p就是 一个指向int型的指针; 在调用时,*p是指指针p指向的那个变量,比如说之前有int a=5;int *p=a; 那么p的值是a的地址,也就是指针p指向a,*p则等于a的值,即*p=5。 而&,则是引用,比如说有定义int a=5;再定义int b=&a;那么这里的b则引用 a的值,即b=5 ,而再给b赋值:b=10,a的值也会变为10。 我想楼主会问*和&的区别,应该是针对函数定义里的参数而言吧,因为这里的这两者 比较相似: 举几个简单例子: 先定义有int x=0;和int *p=x; 1、若定义函数: void fun_1(int a){ a=5;} , 则调用:fun_1(x); 之后, x还等于0;因为fun_1函数只改变了形参a的值,a只是fun_1函数里的局部变量,调用 fun_1(x)相当于是“a=x;a=5;”,x没变; 2、若定义函数:void fun_2(int &a){ a=5;} , 则调用:fun_2(x); 之后, x等于5;因为这里的a引用了x的值; 3、若定义函数:void fun_3(int *a){ *a=5;} , 则调用:fun_3(p); 之后, x也等于5;因为fun_3函数的参数a是一个指针,相当于a=p;*a则与*p指向同一地址, 改变*a即改变*p即x