函数名称前面加引用“&”或指针符号“*”的意思

学习笔记:

(一)

函数名称前面加引用符号“&”,代表该函数返回值类型是引用。

如:int &operate+(...);

(二)

函数名称前面加指针符号“*”,代表它是函数指针。

函数指针是一个指向函数的指针,函数指针表示一个函数的入口地址。使用函数指针的好处就是在处理“在运行时根据数据的具体状态来选择相应的处理方式”这种需求时更加灵活

定义一个函数指针

指针是变量,所以函数指针也是变量,因此可以使用变量定义的方式来定义函数指针,对于普通的指针,可以这么定义:

int a=10;

int *pa=&a;

这里,pa是一个指向整型的指针,定义这个指针的形式为:

int * pa;

它说明了两点:(1)这是一个指针(2)这是一个指向整型变量的指针

以下给出三个函数指针定义的形式,第一个是C语言的函数指针,第二个和第三个是C++的函数指针的定义形式(都是指向非静态函数成员的函数指针):

int (*pFunction)(float,char,char)=NULL;

int (MyClass::*pMemberFunction)(float,char,char)=NULL;

int (MyClass::*pConstMemberFunction)(float,char,char) const=NULL;


首先,要记住一点的就是形式一定要具备完备性,能表达出我们所要表达的内容,即指向函数这个事实。我们知道普通变量指针可以指向对应类型的任何变量,同样函数指针也应该能够指向对应类型的任何变量。对应的函数类型靠什么来确定?这个我们可以想一下C++的函数重载靠什么来区分不同的函数?这里,函数类型是靠这几个方面来确定的:(1)函数的参数个数(2)函数的参数类型(3)函数的返回值类型。所以我们要设计一种形式,这种形式定义的函数指针能够准确的指向这种函数类型的任何函数。

在C语言中这种形式为:

返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,…);  //注意这是在定义函数指针

嗯,定义变量的形式显然不是我们通常见到的这种形式:

类型名称 变量名称;

因为函数指针不加括号就会产生二义性,就像下面这个:

返回类型 *函数指针名称(参数类型,参数类型,参数类型,…);  //注意这是在定义函数

这样的定义形式定义了一个“返回类型为‘返回类型*’参数为(参数类型,参数类型,参数类型,…)的函数而不是函数指针了。

接下来,对于C++来说,下面这样的定义形式也就不难理解了(加上类名称是为了区分不同类中定义的相同名称的成员函数):

返回类型 (类名称::*函数成员名称)(参数类型,参数类型,参数类型,….

函数的调用规则

一般来说,不用太关注这个问题。调用规则主要是指函数被调用的方式,常见的有_stdcall,_fastcall,_pascal,_cdecl等规则。不同的规则在参数压入堆栈的顺序是不同的,同时在有调用者清理压入堆栈的参数还是由被调用者清理压入堆栈的参数上也是不同的。一般来说,如果你没有显式的说明调用规则的话,编译器会统一按照_cdecl来处理。

 

给函数指针赋值和调用

给函数指针赋值,就是为函数指针指定一个函数名称。这个过程很简单,下面是两个例子:

int func1(float f,int a,int b){return f*a/b;}

int func2(float f,int a,int b){return f*a*b}

然后我们给函数指针pFunction赋值:

pFunction=func1;

pFunction=&func2;

上面这段代码说明了两个问题:(1)一个函数指针可以多次赋值(引用不能这样)(2)取地址符号是可选的,却是推荐使用的。

我们可以思考一下为什么取地址符号是可选的,在普通的指针变量赋值时,如上面所示,需要加取地址符号,而这里却是可选的?这是由于要同时考虑到两个因素(1)避免二义性(2)形式一致性。在普通指针赋值,需要加取地址符号是为了区别于将地址还是将内容赋给指针。而在函数赋值时没有这种考虑,因为这里的语义是清晰的,加上&符号是为了和普通指针变量一致---“因为一致的时候就不容易出错”。

最后我们来使用这个函数,以下两者调用函数的方法都是可以的

pFunction(10.0,’a’,’b’);

(*pFunction)(10.0,’a’,’b’);


同时函数指针可以当参数使用实现回调函数,让程序变得更加简单。


  • 36
    点赞
  • 167
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,指针引用是两个非常常见的概念,它们可以让我们更灵活地操作内存和变量。下面我们详细介绍一下指针引用的概念及其用法。 1. 指针(int*) 指针是一个变量,它存储的是某个对象的地址,我们可以通过指针来访问这个对象。指针的类型与它所指向的对象的类型相同,例如int*表示指向int类型的指针指针的定义方式为: ``` int* ptr; //定义一个指向int类型的指针 ``` 我们可以通过&运算符获取一个对象的地址: ``` int a = 10; int* ptr = &a; //将ptr指向a的地址 ``` 指针的解引用使用*运算符,可以访问指针所指向的对象: ``` int b = *ptr; //将b赋值为10,即ptr所指向的对象a的值 ``` 指针还可以通过运算符进行偏移,例如ptr++表示指针ptr向后移动一个单位,即指向下一个int类型的地址。 2. 引用(int&) 引用是一个别,它与某个对象绑定在一起,我们可以通过引用来访问这个对象。引用的类型与它所绑定的对象的类型相同,例如int&表示绑定一个int类型的引用引用的定义方式为: ``` int a = 10; int& ref = a; //定义一个绑定a的引用ref ``` 我们可以直接通过引用来访问对象: ``` ref = 20; //将a的值改为20 ``` 引用指针的区别在于,引用必须在定义时就进行初始化,并且一旦绑定了某个对象,就不能再绑定其他对象;而指针可以在任何时候指向其他对象。 3. 指向指针指针(int**) 指向指针指针是一种多级指针,它存储的是一个指向指针的地址。例如int**表示指向int*类型的指针指针。 指向指针指针的定义方式为: ``` int a = 10; int* ptr = &a; int** ptr_ptr = &ptr; //定义一个指向ptr的指针指针 ``` 我们可以通过*运算符进行解引用,获取指向的指针: ``` int* ptr2 = *ptr_ptr; //将ptr2指向a的地址 ``` 4. 指针引用(int*&) 指针引用是一种特殊的引用,它绑定的是一个指针的别。例如int*&表示绑定一个int*类型的指针引用指针引用的定义方式为: ``` int a = 10; int* ptr = &a; int*& ref_ptr = ptr; //定义一个绑定ptr的引用ref_ptr ``` 我们可以直接通过引用来访问指针: ``` ref_ptr = nullptr; //将ptr指向空地址 ``` 指针引用可以用于函数参数,这样可以方便地修改指针的值。 5. 引用指针(int&*) 引用指针是一种指向引用指针,它存储的是一个引用的地址。例如int&*表示指向int类型的引用指针引用指针的定义方式为: ``` int a = 10; int& ref = a; int&* ptr_ref = &ref; //定义一个指向ref的指针 ``` 我们可以通过*运算符进行解引用,获取引用: ``` int& ref2 = *ptr_ref; //将ref2绑定到a上 ``` 引用指针也可以用于函数参数,这样可以方便地修改引用的值。 综上所述,指针引用是C++中非常常见的概念,它们可以让我们更灵活地操作内存和变量。在使用时,需要根据实际情况选择适合的方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值