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(ab)return a;
【指针函数c语言 c语言指针函数实例】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[0] 指针返回主函数输出出错提示字符串 "Illegal day"。否则返回主函数输出对应的星期名 。主函数中的第 7 行是个条件语句,其语义是,如输入为负数 (i0) 则中止程序运行退出程序 。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(i0) exit(1);
printf("Day No:---%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((n1||n7) ? name[0] : name[n]);
}
本程序是通过指针函数 , 输入一个 1 ~ 7 之间的整数, 输出对应的星期名 。指针数组的说明与使用一个数组的元素值为指针则是指针数组 。指针数组是一组有序的指针的集合 。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量 。
指针数组说明的一般形式为: 类型说明符 * 数组名 [ 数组长度 ]
其中类型说明符为指针值所指向的变量的类型 。例如: int *pa[3] 表示 pa 是一个指针数组,它有三个数组元素,每个元素值都是一个指针,指向整型变量 。通常可用一个指针数组来指向一个二维数组 。指针数组中的每个元素被赋予二维数组每一行的首地址,因此也可理解为指向一个一维数组 。图 6—6 表示了这种关系 。
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *pa[3]={a[0],a[1],a[2]};
int *p=a[0];
main()
{
int i;
for(i=0;i3;i)
printf("%d,%d,%d/n",a[i][2-i],*a[i],*(*(a i) i));
for(i=0;i3;i)
printf("%d,%d,%d/n",*pa[i],p[i],*(p i));
}
本例程序中 , pa 是一个指针数组,三个元素分别指向二维数组 a 的各行 。然后用循环语句输出指定的数组元素 。其中 *a[i] 表示 i 行 0 列元素值; *(*(a i) i) 表示 i 行 i 列的元素值; *pa[i] 表示 i 行 0 列元素值;由于 p 与 a[0] 相同,故 p[i] 表示 0 行 i 列的值; *(p i) 表示 0 行 i 列的值 。读者可仔细领会元素值的各种不同的表示方法 。应该注意指针数组和二维数组指针变量的区别 。这两者虽然都可用来表示二维数组 , 但是其表示方法和意义是不同的
C语言:指针函数跟函数指针的区别本质的区别是:
一个是函数 一个是指针变量
1、指针函数是指带指针的函数,即本质是一个函数 。函数返回类型是某一类型的指针
类型标识符*函数名(参数表)
int *f(x,y);
2、函数指针是指向函数的指针变量 , 即本质是一个指针变量 。
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
希望对您有所帮助
c语言函数指针的作用 。C语言中函数指针与普通指针没什么差别,只是指向的内容不同而已 。主要作用:
1、实现面向对象编程中的多态性 。
2、回调函数 。
函数指针是指向函数的指针变量 。因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数 。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数 。
C在编译时 , 每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址 。有了指向函数的指针变量后,可用该指针变量调用函数 , 就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的 。
函数指针有两个用途:调用函数和做函数的参数 。
C语言指针函数char *match (char*s,char ch1,char ch2)
函数各部分的含义:
第一个char,一般是代表函数的返回值是一个字符 。但是它后面有一个*,应该把char和*连起来看,就是char*了 。
那么,第一个就是char*,代表函数的返回值是一个字符指针(地址) 。
match是函数的名字 。
括号内是函数的参数,多个参数用逗号分隔 。本例共有3个参数:char*s,char ch1,char ch2,第一个是s,类型为char*型(字符指针型),后两个ch1、ch2都是char型(字符型) 。
到这儿,你就知道去掉*match前的*为什么就不对了 。
另外,括号里参数类型(如包含指针)跟函数返回值的类型无关 。函数名前加不加*只与函数返回值的类型有关 。
C语言中,指针函数和函数指针有什么区别?在C语言中指针函数和函数指针是两个不同的概念,不能混淆 。
指针函数本质上是函数,是一个返回类型为指针的函数 , 如:
int* max(int *array,int n)
{
//找最大值的地址
return 最大值的地址;
}
max就是一个指针函数 。
而函数指针本质上是指针,是指向函数的指针,如:
int (*funp)(int a,int b);
funp就是一个函数指针,可以用它指向一个返回类型为int、有两个int类型的参数的函数 。
C语言-函数指针/*
函数指针,关键是后面两个字“指针”,顾名思义,是一个指向函数的指针
原理:函数在创建好了后 , 函数的代码会在内存中占有个位置,这时我们创造一个指针来指向这个地址,这个指针就叫函数指针
函数指针不可以移动,想要移动指针的位置来指向函数的下一个指令的想法是错误的
函数指针的要求,
1,首先这个指针,要和函数的返回类型一样
2,指针的*和名字,要用小括号括起来//不括起来就是指针函数了 , 意思就变成,函数返回一个指针了
3,最右边的小括号里形参位置的类型,形参的个数,也要和函数定义时的形参一致,只要类型,不要形参名即可 ,
但是加上形参名也可以,没毛病,看上去也更清晰
*/
#include
void swapchar(char *a, char *b)
{
char t;
t = *a;
*a = *b;
*b = t;
}
void swapchar2(char * a2, char * b2)
{
printf("this is swapchar2");
}
int main(void)
{
char chf = 'a', chg = 'j';
void(*p)(char * a, char * b);//定义函数指针、形参名字a、b可有可无,但有的话看上去更清晰,只要函数定义的类型、参数类型、以及参数个数,与这个指针一致,那么这个指针p,就可以指向它
p = swapchar;//p指针接管swapchar函数,只要给函数名字 , 就可以给过去了
printf("chf=%c,chg=%c ", chf, chg);
p(chf, chg);
printf("chf=%c,chg=%c ", chf, chg);
p = swapchar2;//这里把swapchar2函数的地址,给了p,这时p从swapchar地址,转移到了swapchar2这里 。
p(chf,chg);
return 0;
}
关于指针函数c语言和c语言指针函数实例的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。
推荐阅读
- linux运维命令详解,linux运维命令常用命令
- redis实现访问频率限制,redis访问频率控制
- 瑞安省心工商代理平台,瑞安工商局
- 电脑没有mysql怎么办 电脑服务里面没有mysql
- ERP系统被黑客攻击了,软件被黑客攻击
- 怎么看oracle数据规模,查oracle数据表数据大小
- 华为与鸿蒙最新信息,华为鸿蒙与emui
- 表分区后java代码,java分区存储
- 笔记本硬盘线怎么拆,笔记本电脑硬盘连接线怎么取下来呀