(9)指针函数和函数指针

指针的声明:

指针其实是一个变量,指针的声明方式与一般的变量声明类似,如下:

int *p;             // 声明一个 int类型的指针,该指针指向一个int类型的对象
char *p;            // 声明一个 char类型的指针,该指针指向一个 char类型的对象
int *arr[10];       // 声明一个指针数组, 该数组有10个元素,其中每个元素都是一个指向int 类型对象的指针
int*arr)[10];    // 声明一个数组指针,该指针指向一个 int 类型的以为数组
int **p;            // 声明一个二级指针p,该指针指向一个 int 类型的指针

声明一个指针变量并不会自动分配任何内存。在对指针进行间接访问之前,指针必须进行初始化:或是使他指向现有的内存,或者给他动态分配内存,否则我们并不知道指针指向哪儿,这个问题需要特别关注。

什么是函数指针?

函数指针定义:函数指针是指向函数的指针变量。因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。

其通用表达式为类型说明符 (*函数名) (参数)

int (*fun)(int x);        // 函数指针的定义
int (*fun)(int x,int y);  // 函数指针的定义

函数指针的赋值
函数指针和其他指针一样定义后使用之前也需要初始化。
函数指针有两个用途:调用函数做函数的参数

int (*fun)(int x,int y);  // 函数指针的定义
fun=&Function;            // 函数指针的赋值方式1
fun=Function;             // 函数指针的赋值方式2
x=(*fun)();               // 函数指针的调用方式1
x=fun();                  // 函数指针的调用方式2,错误的方式

函数赋值的时候取地址运算符&不是必需的,因为一个函数标识符就表示了它的地址,并且赋值的时候函数不需要带圆括号;

如果是函数调用,还必须包含一个圆括号括起来的参数表。

函数指针的用法
我们使用指针的时候,需要通过钥匙 * 来取其内存里面的值,函数指针使用也是如此。通过(*pf)取出存在这个地址上的函数,然后调用它。


char* fun(char * p1,char* p2)
{
    
    
int i=0;
i=strcmp(p1,p2);
if(i==0)
{
    
    
return p1;
}
else
{
    
    
return p2;
}
}

int main()
{
    
    
char *(*pf)(char *,char *);
pf=&fun;
(*pf)("a","b");
return 0;
}

什么是指针函数?

**指针函数的定义:**指针函数的落脚点是一个函数,这个函数的返回值是一个指针,与普通函数 int function(int, int)类似,只是返回的数据类型不一样而已。

_type_ *function(int, int);   // 返回的是指针地址
int function(int, int);       // 返回的是int类型的数据
int *fun(int x);              // 指针函数的定义
int * fun(int x, int y);      // 指针函数的定义
int* fun(int x,int y);        // 指针函数的定义

以上三种写法都正确,但是 * 靠近返回值更容易理解一点。

指针函数的调用
在调用指针函数时,需要一个同类型的指针来接收其函数的返回值。

typedef struct _Data{
    
    
int a;
int b;
} Data;

// 指针函数
Data* f(int a,int b)
{
    
    
Data *data=new Data;
data->a=a;
data->b=b;
return data;
}

int main()
{
    
    
Data *myData=f(4,5);
cout<<"f(4,5) = " << myData->a << myData->b;
return 0;
}

不过也可以将其返回值定义为 void* 类型,在调用的时候强制转换返回值为自己想要的类型。

其输出结果是一样的,不过不建议这么使用,因为强制转换可能会带来风险。返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。

事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。

比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。


函数指针与指针函数区别

1. 定义不同

  • 指针函数本质是一个函数,其返回值为指针。

  • 函数指针本质是一个指针,其指向一个函数。

2. 写法不同

  • 指针函数:int* fun(int x,int y);

  • 函数指针:int (*fun)(int x,int y);

可以简单粗暴的理解为,指针函数的*是属于数据类型的,而函数指针的星号是属于函数名的。

再简单一点,可以这样辨别两者:函数名带括号的就是函数指针,否则就是指针函数。

3. 用法不同
上面函数指针和指针函数的用法都有,但是函数指针的用法会更多,相对而言难度也更大,例如函数指针与回调函数,如果是C++非静态成员函数指针,其用法也会有一些区别,感兴趣的同学可以关注后续推文或自行查阅相关书籍。

猜你喜欢

转载自blog.csdn.net/qq_40329851/article/details/114951175
今日推荐