6、 指针和函数
函数是C程序的基本模块,在编译C程序时,系统会为每一个函数分内存单元,函数既然占有内存单元,那么函数也是有地址的,这个地址称作函数的入口地址。
6.1 函数的指针和指向函数的指针变量
让指针变量指向函数,代码形式如下:
指针变量=函数名
指向函数的指针一般定义形式为:
类型说明符(*指针变量名)(函数参数表列)
用指针变量调用所指向的函数时,需要注意:
(1)指针变量必须已经指向了某个函数。
(2)数据类型可以是整型、实型、字符型甚至是结构型的数据类型。定义指针变量时的数据类型和定义函数时的数据类型必须一致。
(3)指针变量名是用户所选用的标识符,表示指向函数的指针变量。
(4)“*指针变量”必须加括号,因为运算符*的优先级低于运算符( )。若写成int *p( );因为运算符“*”的优先级低于“( )”,所以,会是p先和( )结合,代表这是一个函数。该函数的返回值是指向整型的指针。
在定义函数指针之后,可以通过它间接调用所指向的函数。同其他类型指针相似,首先将一函数名赋给函数指针,然后才可以通过函数指针间接调用这个函数。一个函数指针既可以指向用户自定义的函数,也可以指向由C语言系统所提供的库函数。
例如:
int funct(int,int); //定义一个函数
int (*p)(int,int); //定义一个指向函数的指针变量
p=funct; //把函数入口地址赋值给指针变量
其中,p是一个函数指针,这个函数的返回值是整型。也就是说,p所指向的函数只能是返回值为整型的函数。
在定义函数的指针变量时,可以不赋初值。如果赋初值,则初值是一个已经定义好的某个函数的函数名,这时,称该指针变量指向对应的函数。例如:
int (*p)( )=find_max; //赋初值
int (*p)( ); //不赋初值,在后面赋值
p=find_max;
在定义函数指针变量的时候,数据类型说明符是所指向的函数的返回值的类型,如果函数没有返回值,那么这里的函数返回值的类型就应该是void类型。
实例1如下所示:
#include <stdio.h>
void sum(int x,int y)//定义一个没有返回值的求和函数
{
int z;
z = x + y;
printf("%d\n",z);
}
int main(int argc, const char * argv[]) {
void (*p)(int ,int); //定义一个viod类型的指向函数的指针变量
int a = 3,b = 4;
p = sum ; //让指针变量p指向求和函数sum()
sum(a, b); //用函数名调用函数
(*p)(a,b); //用函数指针调用函数
return 0;
}
在实例1中定义了一个求和函数sum(),定义了一个指针函数的指针变量。使用这两种方法调用函数求两个数的和。void (*p)(int,int) 表示定义了一个指向函数的指针变量p,该指针变量不是固定指向一个函数的,而是用来指向具有void 函数名 (int,int);这样形式的所有函数的。在给函数指针变量赋值的时候,只需要给函数名,不需要给参数。例如:p = sum;因为这只是吧函数的入口地址赋值给指针变量p,不涉及到参数问题。不可以写成 p = sum(int,int);或者p = sum(a,b);。在使用函数指针调用函数的时候只需要将(*p)代替函数名即可,在(*p)之后的括号中人需要写入参数。对于函数指针变量,像p++/p--/++p/--p运算都是没有意义的。
实例2如下所示:
#include <stdio.h>
void sum(int x,int y)//定义一个没有返回值的求和函数
{
int z;
z = x + y;
printf("%d\n",z);
}
int main(int argc, const char * argv[]) {
void (*p)(int ,int); //定义一个viod类型的指向函数的指针变量
int a = 3,b = 4;
p = sum(int,int) ; //让指针变量p指向求和函数sum()
sum(a, b); //用函数名调用函数
(*p)(a,b); //用函数指针调用函数
return 0;
}
当使用 p = sum(int,int) 让指针变量p指向求和函数sum()时,程序出现错误(Expected expression)。
实例3如下所示:
#include <stdio.h>
void sum(int x,int y)//定义一个没有返回值的求和函数
{
int z;
z = x + y;
printf("%d\n",z);
}
int main(int argc, const char * argv[]) {
void (*p)(int ,int); //定义一个viod类型的指向函数的指针变量
int a = 3,b = 4;
p = sum(a,b) ; //让指针变量p指向求和函数sum()
sum(a, b); //用函数名调用函数
(*p)(a,b); //用函数指针调用函数
return 0;
}
当使用p = sum(a,b);让指针变量p指向求和函数sum()的时候程序出现错误。Assigning to 'void (*)(int,int)' from incompatible type 'void'。
|
|