指针函数和函数指针的区别 指针函数
文章插图
指针函数(指针函数和函数指针的区别)
在第22节中,我们找出了数组指针和指针数组的信息资源网络 。现在趁热打铁,我们来看看函数指针和指针函数 。
初学者看到这里,可能会觉得 C 语言是一门喜欢咬文嚼字的编程语言,其实弄懂了,你自然也会这么称呼它们的 。
【指针函数和函数指针的区别 指针函数】
函数指针回想一下第22节 。只要我们把“数组”当成类似“int”的数据类型,数组指针和指针数组就有明显的区别 。int指针引用int类型的数据,然后数组指针引用数组指针 。int数组是存储int数据的数组,指针数组是存储指针的数组 。在C语言中,函数也是一种类型,函数指针是指向函数的指针 。
如何定义函数指针?请看下面的例子:
#include void hello(char* name){ printf("hello, %s\n", name);}int&nb信息资源网sp;main(){ void (*f)(char *) = hello; f("Jim"); return 0;}
定义函数指针的表达式void (* f )(char *)类似于第22节中数组指针的定义 。()优先级高,所以f先和*结合,所以f先是指针 。是什么类型的?* f是函数原型的格式,参数是char*,返回值是void,所以F是函数类型的指针 。而hello函数恰好有char*类型的实参和void类型的返回值,所以函数指针F可以指向hello 。也可以写成:
void (*f)(char *) =&hello;函数指针也可以调用它所指向的函数,比如上面的F(“Jim”),或者以(* F)(“Jim”)的形式 。需要注意的是,F单独写的时候是函数指针,没有函数调用 。要调用函数,需要添加“()”符号 。
可以把 “()”理解为函数调用的运算符,它的左侧要求是函数指针 。新手看到这里可能会有一些疑问 。比如为什么初始化F时可以直接给F赋值hello或者给F赋值&hello?比如为什么可以直接通过F(“Jim”)或者(* F)(“Jim”)调用函数?其实做个实验就明白了 。让我们打印出&你好,你好,*你好的地址 。请看:
printf("&hello: %p\n", &hello);printf(" hello: %p\n", hello);printf("*hello: %p\n", *hello);编译执行,你会发现这三者其实是相等的,所以虽然上面描述的用法略有不同,但是程序是可以正常工作的 。
但是在使用函数指针的时候,有些程序员更习惯于下面的,以至于一眼就能看出是在使用函数指针 。当然,用哪个主要看个人习惯 。
当使用hello作为函数指针时,使用&hello 。
f是指向一个函数的指针 。通过f调用函数时,使用(* f)(…) 。
好了,现在我知道如何使用函数指针了 。但是,函数指针的定义有些繁琐 。如果我想定义同类型的多个函数,就要写很多重复的代码 。那不是“不优雅”吗?事实上,应该尽可能避免重复代码 。好在C语言有typedef关键字 。
typedef unsigned char uchar;uchar i = 0;
typedef关键字使我们能够用其他符号替换复杂的数据类型 。例如,在上面例子的代码中,我们使用uchar符号代替“unsigned char”类型 。如果以后要定义无符号char类型的变量,可以直接使用uchar 。在上面的例子中,我们使用uchar定义了一个无符号字符类型的变量I 。指针的定义也可以用typedef关键字简化:
typedef void 信息资源网(*FUN)(char *);FUN f = &hello;(*f)("Jim");我们使用有趣的符号代替函数指针类型 。这个函数的参数类型是char*,返回值是void 。以后遇到这类函数,可以直接用FUN符号定义对应的函数指针 。
指针功能好像又是一个陌生的词,但是我们对int函数还是挺熟悉的,这是一个返回int数据的函数 。相比之下,指针函数是一个返回指针的函数 。就这么简单?是的,就这么简单 。下面是一个使用指针函数的例子,请看:
#include char *str1 = "hello, i am Jim\n";char *str2 = "hello, i am Tom\n";char *get_str(){ static char i = 0; if((i ++)%2) return str1; else return str2;}int main(){ printf("%s", get_str()); printf("%s", get_str()); return 0;}Get_str函数返回值为char指针类型,所以get_str是指针函数 。它的调用方式与int等其他类型的函数相同 。指针函数没什么特别的 。
摘要指针函数是返回值是指针类型的函数 。函数指针是指向一个函数的指针,它所指向的函数可以通过函数指针来调用 。通过函数指针可以让C语言模仿C++实现“类”的封装,接下来会介绍 。
欢迎在评论区一起讨论提问 。文章都是手工原创,每天用最简单的方式介绍C语言 。如果你喜欢我的文章,就关注一下,可以看到最近的更新和之前的文章 。
推荐阅读
- 好喝的红茶品牌,金骏眉祁门红茶好喝
- 红茶和茶叶有什么区别,锡兰红茶阿萨姆红茶区别
- 红茶的别称,铁观音和红茶的区别
- 室内楼梯设计和装修常识
- 茶水是红色就是红茶吗,生红茶和熟红茶的区别
- 土壤温度计的用途和功能特点
- 土壤保水剂的用途和意义是什么
- 弑和杀的区别是什么?
- 小老鼠和奶酪的故事?老鼠与奶酪的小故事
- 天玑1100好还是骁龙750G好-骁龙750g和天玑1100哪个好-