C 温故知新 之 指针:函数指针变量、指针型函数
猛一看还真有点糊糊;注意区别:
1、函数型指针:指函数返回值的类型。
指针型函数:返回值是一个指针(即地址)
2、int(*p)()和int *p() 是一样吗?为什么?
int (*p)()是一个变量说明,说明 p 是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。 -->函数型指针
int *p()则不是变量说明而是函数说明,说明 p 是一个指针型函数,其返回值是一个指向整型量的指针,*p 两边没有括号。作为函数说明,在括号内最好写入形式参数.-->指针型函数
一、函数型指针
在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。
函数指针变量定义的一般形式为:
类型说明符 (*指针变量名)();
其中“类型说明符”表示被指函数的返回值的类型。 “(* 指针变量名)”表示“*”后面的变量是定义的指针变量。最后的空括号表示指针变量所指的是一个函数。
例如:int (*p)();
p表示是一个指向函数入口的指针变量,该函数的返回值(函数值)是整型。
Eg:
main() { int SelectMax(int a,int b);//函数声明 int (*pmax)();//函数指针变量定义的一般形式为:类型说明符 (*指针变量名)(); int x,y,z; pmax = SelectMax;//指针赋值,方法不要括号 printf("输入两位数字:\n"); scanf("%d%d",&x,&y);// 给a.b赋值 z = (*pmax)(x,y);//调用方法 printf("最大值:%d \n最小值:%d\n",x,y); } int SelectMax(int a,int b) { if(a>b) return a; else return b; }
结果:
解释:
1、先定义函数指针变量,如后一程序中第 9 行 int (*pmax)();定义 pmax 为函数指针变量。
2、把被调函数的入口地址(函数名)赋予该函数指针变量,如程序中第 11 行 pmax=SelectMax;
3、用函数指针变量形式调用函数,如程序第 14 行 z=(*pmax)(x,y);
调用函数的一般形式为:
(*指针变量名) (实参表)
4、使用函数指针变量还应注意以下两点:
1、函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的
2、函数调用中"(*指针变量名)"的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号
二、指针型函数
函数类型是指函数返回值是一个值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。
定义指针型函数的一般形式为:
类型说明符 *函数名(形参表)
{
…… /*函数体*/
}
其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。
如:
int *ap(int x,int y)
{
...... /*函数体*/
}
表示 ap 是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。
Eg:
main() { int i; char *day_name(int n); printf("输入天数:\n"); scanf("%d",&i); if(i<0) exit(1); printf("今天是:%2d-->%s\n",i,day_name(i)); } har *day_name(int i) { static char *name[8]={ "非法的数字","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday" }; return (i<1||i>7?name[0]:name[i]); }
结果:
函数指针和指针函数注意区别:
函数指针 int (*p) ()
指针函数 int *p() 一般还有函数体 int *p(){……}
作者:PEPE
出处:http://pepe.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者:PEPE
出处:http://pepe.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。