指针函数的定义格式?指针类型函数,有什么用途

:暂无数据 2026-07-30 05:50:09 4

指针函数的定义格式?指针类型函数,有什么用途

“指针型函数”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看指针函数的定义格式?指针类型函数,有什么用途!

本文目录

指针函数的定义格式

类型名 *函数名(函数参数列表);
其中,后缀运算符括号“()”表示这是一个函数,其前缀运算符星号“*”表示此函数为指针型函数,其函数值为指针,即它带回来的值的类型为指针,当调用这个函数后,将得到一个“指向返回值为…的指针(地址),“类型名”表示函数返回的指针指向的类型”。
“(函数参数列表)”中的括号为函数调用运算符,在调用语句中,即使函数不带参数,其参数表的一对括号也不能省略。其示例如下:
int *pfun(int, int);
由于“*”的优先级低于“()”的优先级,因而pfun首先和后面的“()”结合,也就意味着,pfun是一个函数。即:
int *(pfun(int, int));
接着再和前面的“*”结合,说明这个函数的返回值是一个指针。由于前面还有一个int,也就是说,pfun是一个返回值为整型指针的函数。
返回类型可以是任何基本类型和复合类型。返回指针的函数的用途十分广泛。事实上,每一个函数,即使它不带有返回某种类型的指针,它本身都有一个入口地址,该地址相当于一个指针。比如函数返回一个整型值,实际上也相当于返回一个指针变量的值,不过这时的变量是函数本身而已,而整个函数相当于一个“变量”。例如下面一个返回指针函数的例子: #include 《stdio.h》 float *find(float(*pionter),int n)/*定义指针函数*/ {     float *pt;     pt=*(pionter+n);     return(pt); }共有三个学生的成绩,函数find()被定义为指针函数,其形参pointer是指针指向包含4个元素的一维数组的指针变量。pointer+n指向score的第n+1行。*(pointer+1)指向第一行的第0个元素。pt是一个指针变量,它指向浮点型变量。main()函数中调用find()函数,将score数组的首地址传给pointer.

指针类型函数,有什么用途

函数指针,一般用途作为“回调函数”使用。

比如写了一个方法(函数),你希望调用它执行完处理之后,自动调用另一个后续的函数来处理继续的业务。这个时候就可以把 “一个函数的入口地址”当是一个指针。 你的处理方法中接受函数参数时把这个指针传进来。

就你以的例子为例

int *myPlus(int a, int b)
{
printf("plus:%d + % d = %d\n" ,a ,b, a + b );
return 0;
}
int *myMinus(int a, int b)
{
printf("minus: %d - % d = %d\n", a, b, a - b);
return 0;
}
int funt2( int a, int b , void *funtz )
{
/**
*/
int(*pf)(int, int) = ( int (*)(int,int ) )funtz;
pf(a, b);
return 0;
}
int main()
{
funt2(  10,20, myPlus );  //myPlus 是一个函数指针,它现在是作为一个参数在传递
funt2(  10,20, myMinus );
return 0;
}

C语言中,指针型函数和函数型指针的区别

指针函数,本质上是一个函数,只是函数的返回值是一个指针,比如int
*f()
函数指针,本质上是一个指针,只是指向的是一个函数,比如int
(*f)()

C指针函数

定义的函数char *day_name(int n)是一个指针型函数,返回的应该是一个地址值,那为何在输出语句里面最后输出的却是地址里面的内容?
首先,char *day_name(int n) 这个函数声明了一个类型,这个类型是个函数类型,这种类型的函数接受一个整型参数,返回一个字符指针。至于你说的输出内容,那是printf的内部实现,%s是printf的格式化输出格式,当printf分析到这个标记时,就会把对应位置的参数当作字符指针,就是你说的地址值,然后去取地址里面的内容,然后往终端输出,这样你就可以看到输出了。printf没有类型安全检查,如果你的%s对应的是个无效的地址值,那么程序运行结果是未定义的,极有可能因为非法访问而崩溃了。如果你在linux底下,可以在终端里面输入命令man printf来查看printf的详细用法。

C语言指针函数

如果在程序中定义了一个函数,那么在编译时系统就会为这个函数代码分配一段存储空间,这段存储空间的首地址称为这个函数的地址。而且函数名表示的就是这个地址。既然是地址我们就可以定义一个指针变量来存放,这个指针变量就叫作函数指针变量,简称函数指针。
那么这个指针变量怎么定义呢?虽然同样是指向一个地址,但指向函数的指针变量同我们之前讲的指向变量的指针变量的定义方式是不同的。例如:
int(*p)(int, int);
这个语句就定义了一个指向函数的指针变量 p。首先它是一个指针变量,所以要有一个“*”,即(*p);其次前面的 int 表示这个指针变量可以指向返回值类型为 int 型的函数;后面括号中的两个 int 表示这个指针变量可以指向有两个参数且都是 int 型的函数。所以合起来这个语句的意思就是:定义了一个指针变量 p,该指针变量可以指向返回值类型为 int 型,且有两个整型参数的函数。p 的类型为 int(*)(int,int)。
所以函数指针的定义方式为:
函数返回值类型 (* 指针变量名) (函数参数列表);
“函数返回值类型”表示该指针变量可以指向具有什么返回值类型的函数;“函数参数列表”表示该指针变量可以指向具有什么参数列表的函数。这个参数列表中只需要写函数的参数类型即可。
我们看到,函数指针的定义就是将“函数声明”中的“函数名”改成“(*指针变量名)”。但是这里需要注意的是:“(*指针变量名)”两端的括号不能省略,括号改变了运算符的优先级。如果省略了括号,就不是定义函数指针而是一个函数声明了,即声明了一个返回值类型为指针型的函数。
那么怎么判断一个指针变量是指向变量的指针变量还是指向函数的指针变量呢?首先看变量名前面有没有“*”,如果有“*”说明是指针变量;其次看变量名的后面有没有带有形参类型的圆括号,如果有就是指向函数的指针变量,即函数指针,如果没有就是指向变量的指针变量。

c语言指针型函数

#include《string.h》  // 导入头文件《string.h》
#include《stdio.h》   // 导入头文件《stdio.h》
char *fun(char *t)  // 定义函数, 名称fun, 输入参数为char *, 返回值为char *
{
    char *p = t;    // 把t的值赋值给p, 相当于p指向与t相同的字符串
    return p + strlen(t) / 2;   // strlen返回值为字符串长度, 然后p位移其一半(向下取整)的距离并返回值
}
int main(int argc, char *argv)
{
    char *str = "abcdefgh"; // str指向字符串“abcdefgh”
    str = fun(str);         // str调用fun函数, 参数为str, 并将返回值赋值给str
    puts(str);              // 此时str指向e, 输出为“efgh\n”
    return 0;
}

指向函数的指针和指针型函数,搞不太懂啊!

指向函数的指针也叫函数指针,这个指针指向一个函数的首地址,常见于回调函数和其他需要函数做参数的场合,指针型函数也叫指针类型函数,其返回值是一个指针类型,但其函数本身还是一个普通函数;常用于需要返回一个地址的场合,单子函数内部变量的地址因其在栈区则不能作为返回值返回,如需返回子函数内部定义的变量可将变量声明成 static 将变量定义在全局区

C语言中函数指针用法

函数在内存中有一个物理位置,而这个位置是可以赋给一个指针的。一零点函数的地址就是该函数的入口点。因此,函数指针可被用来调用一个函数。函数的地址是用不带任何括号或参数的函数名来得到的。(这很类似于数组地址的得到方法,即,在只有数组名而无下标是就得到数组地址。)
怎样说明一个函数指针变量呢 ?
为了说明一个变量 fn_pointer 的类型是"返回值为 int 的函数指针", 你可以使用下面的说明语句:
int (*fn_pointer) ();
为了让编译器能正确地解释这句语句, *fn_pointer 必须用括号围起来。若漏了这对括号, 则:
int *fn_pointer ();
的意思完全不同了。fn_pointer 将是一个函数名, 其返回值为 int 类型的指针。
2:函数指针变量
在C语言中规定,一个函数总是占用一段连续的内存区, 而函数名就是该函数所占内存区的首地址。 我们可以把函数的这个首地址 ( 或称入口地址 ) 赋予一个指针变量, 使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为 " 函数指针变量 " 。
函数指针变量定义的一般形式为:
类型说明符 (* 指针变量名 )();
其中 " 类型说明符 " 表示被指函数的返回值的类型。 "(* 指针变量名 )" 表示 "*" 后面的变量是定义的指针变量。 最后的空括号表示指针变量所指的是一个函数。
例如: int (*pf)();
表示 pf 是一个指向函数入口的指针变量,该函数的返回值 ( 函数值 ) 是整型。
下面通过例子来说明用指针形式实现对函数调用的方法。
int max(int a,int b)
{
if(a》b)return a;
else return b;
}
main()
{
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:/n");
scanf("%d%d",&x,&y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);
}
从上述程序可以看出用,函数指针变量形式调用函数的步骤如下:
1》. 先定义函数指针变量,如后一程序中第 9 行 int (*pmax)(); 定义 pmax 为函数指针变量。
2》. 把被调函数的入口地址 ( 函数名 ) 赋予该函数指针变量,如程序中第 11 行 pmax=max;
3》. 用函数指针变量形式调用函数,如程序第 14 行 z=(*pmax)(x,y); 调用函数的一般形式为: (* 指针变量名 ) ( 实参表 ) 使用函数指针变量还应注意以下两点:
a. 函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。
b. 函数调用中 "(* 指针变量名 )" 的两边的括号不可少,其中的 * 不应该理解为求值运算,在此处它只是一种表示符号。
3:指针型函数
前面我们介绍过,所谓函数类型是指函数返回值的类型。 在C语言中允许一个函数的返回值是一个指针 ( 即地址 ) ,这种返回指针值的函数称为指针型函数。
定义指针型函数的一般形式为:
类型说明符 * 函数名 ( 形参表 )
{
…… /* 函数体 */
}
其中函数名之前加了 "*" 号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。
如:
int *ap(int x,int y)
{
…… /* 函数体 */
}
表示 ap 是一个返回指针值的指针型函数, 它返回的指针指向一个整型变量。下例中定义了一个指针型函数 day_name ,它的返回值指向一个字符串。该函数中定义了一个静态指针数组 name 。 name 数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参 n 表示与星期名所对应的整数。在主函数中, 把输入的整数 i 作为实参, 在 printf 语句中调用 day_name 函数并把 i 值传送给形参 n 。 day_name 函数中的 return 语句包含一个条件表达式, n 值若大于 7 或小于 1 则把 name 指针返回主函数输出出错提示字符串 "Illegal day" 。否则返回主函数输出对应的星期名。主函数中的第 7 行是个条件语句,其语义是,如输入为负数 (i《0) 则中止程序运行退出程序。 exit 是一个库函数, exit(1) 表示发生错误后退出程序, exit(0) 表示正常退出。
应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如 int(*p)() 和 int *p() 是两个完全不同的量。 int(*p)() 是一个变量说明,说明 p 是一个指向函数入口的指针变量,该函数的返回值是整型量, (*p) 的两边的括号不能少。
int *p() 则不是变量说明而是函数说明,说明 p 是一个指针型函数,其返回值是一个指向整型量的指针,*p 两边没有括号。作为函数说明, 在括号内最好写入形式参数,这样便于与变量说明区别。 对于指针型函数定义,int *p() 只是函数头部分,一般还应该有函数体部分。
main()
{
int i;
char *day_name(int n);
printf("input Day No:/n");
scanf("%d",&i);
if(i《0) exit(1);
printf("Day No:%2d--》%s/n",i,day_name(i));
}
char *day_n
ame(int n)
{
static char *name={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
return((n《1||n》7) ? name);
}
本程序是通过指针函数,输入一个 1 ~ 7 之间的整数, 输出对应的星期名。指针数组的说明与使用一个数组的元素值为指针则是指针数组。指针数组是一组有序的指针的集合。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。
指针数组说明的一般形式为: 类型说明符 * 数组名
其中类型说明符为指针值所指向的变量的类型。例如: int *pa 表示 pa 是一个指针数组,它有三个数组元素, 每个元素值都是一个指针,指向整型变量。通常可用一个指针数组来指向一个二维数组。 指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数组。图 6—6 表示了这种关系。
int a={1,2,3,4,5,6,7,8,9};
int *pa};
int *p=a;
main()
{
int i;
for(i=0;i《3;i++)
printf("%d,%d,%d/n",a,*(*(a+i)+i));
for(i=0;i《3;i++)
printf("%d,%d,%d/n",*pa,*(p+i));
}
本例程序中, pa 是一个指针数组,三个元素分别指向二维数组 a 的各行。然后用循环语句输出指定的数组元素。其中 *a 表示 0 行 i 列的值; *(p+i) 表示 0 行 i 列的值。读者可仔细领会元素值的各种不同的表示方法。 应该注意指针数组和二维数组指针变量的区别。 这两者虽然都可用来表示二维数组,但是其表示方法和意义是不同的

关于指针型函数到此分享完毕,希望能帮助到您。

指针函数的定义格式?指针类型函数,有什么用途

本文编辑:admin

更多文章:


高中信息技术python(高考信息技术用的是什么语言)

高中信息技术python(高考信息技术用的是什么语言)

今天给各位分享高考信息技术用的是什么语言的知识,其中也会对高考信息技术用的是什么语言进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年9月22日 02:50

cocos creator中文(cocoscreator和cocoscreator3d的区别)

cocos creator中文(cocoscreator和cocoscreator3d的区别)

各位老铁们好,相信很多人对cocos creator中文都不是特别的了解,因此呢,今天就来为大家分享下关于cocos creator中文以及cocoscreator和cocoscreator3d的区别的问题知识,还望可以帮助大家,解决大家的

2026年9月22日 02:30

二进制转换十进制函数(二进制如何转换成十进制数)

二进制转换十进制函数(二进制如何转换成十进制数)

这篇文章给大家聊聊关于二进制转换十进制函数,以及二进制如何转换成十进制数对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

2026年9月22日 01:30

大一程序设计基础题库(c语言程序设计试题)

大一程序设计基础题库(c语言程序设计试题)

今天给各位分享c语言程序设计试题的知识,其中也会对c语言程序设计试题进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

2026年9月22日 01:00

方舟生存进化新物种图鉴中英文对照图鉴 庞马资料图鉴 庞马(Equus magnus)?植物大战僵尸英文版图鉴

方舟生存进化新物种图鉴中英文对照图鉴 庞马资料图鉴 庞马(Equus magnus)?植物大战僵尸英文版图鉴

各位老铁们,大家好,今天由我来为大家分享图鉴英文,以及方舟生存进化新物种图鉴中英文对照图鉴 庞马资料图鉴 庞马(Equus magnus)的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,

2026年9月22日 00:10

servlet容器配置(web.xml不包含哪些定义)

servlet容器配置(web.xml不包含哪些定义)

大家好,servlet容器配置相信很多的网友都不是很明白,包括web.xml不包含哪些定义也是一样,不过没有关系,接下来就来为大家分享关于servlet容器配置和web.xml不包含哪些定义的一些知识点,大家可以关注收藏,免得下次来找不到哦

2026年9月21日 22:40

全球著名软件公司?oracle究竟是什么软件

全球著名软件公司?oracle究竟是什么软件

各位老铁们,大家好,今天由我来为大家分享软件公司,以及全球著名软件公司的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!

2026年9月21日 18:50

html document对象(载入浏览器的html文档都会成为document的对象吗)

html document对象(载入浏览器的html文档都会成为document的对象吗)

其实html document对象的问题并不复杂,但是又很多的朋友都不太了解载入浏览器的html文档都会成为document的对象吗,因此呢,今天小编就来为大家分享html document对象的一些知识,希望可以帮助到大家,下面我们一起来

2026年9月21日 16:00

安装包怎样下载mysql(如何在官网上下载可安装版的MySQL数据库)

安装包怎样下载mysql(如何在官网上下载可安装版的MySQL数据库)

大家好,安装包怎样下载mysql相信很多的网友都不是很明白,包括如何在官网上下载可安装版的MySQL数据库也是一样,不过没有关系,接下来就来为大家分享关于安装包怎样下载mysql和如何在官网上下载可安装版的MySQL数据库的一些知识点,大家

2026年9月21日 15:30

威廉尖叫音效在线(渴求《勇敢的心》的配乐a gift of a thistle下载)

威廉尖叫音效在线(渴求《勇敢的心》的配乐a gift of a thistle下载)

各位老铁们,大家好,今天由我来为大家分享威廉尖叫音效在线,以及渴求《勇敢的心》的配乐a gift of a thistle下载的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈

2026年9月21日 15:20

最近更新

南京官方网站优化如何提升排名?
2026-09-22 04:48:35 浏览:0
如何快速搭建Android开发环境
2026-09-22 04:47:07 浏览:0
广告关键词优化合作方式怎么收费?
2026-09-22 04:47:03 浏览:0
如何挑选适合临淄网站优化的工具?
2026-09-22 04:46:33 浏览:0
热门文章

wait for you杨和苏(大家听下(wait for you)这首英文歌的开头那段音乐)
2026-06-13 16:20:04 浏览:22
刷关键字排名怎么操作最有效?
2026-09-14 20:02:13 浏览:13
oppo a9拆机教程(oppoa9拆机教程)
2026-06-13 10:40:02 浏览:12
标签列表