函数指针!!

来源:互联网 发布:支持ubuntu的手机 编辑:程序博客网 时间:2024/06/03 21:14

在讲函数指针之前看一下数组作为函数参数,数组作为函数参数时,系统不会为形参数组分配内存,是将原函数的实参数组地址直接作为传送给形参数组,也就是直接赋地址给形参数组。这种可以改变地址上的值的传值方式为"按引用传递",而用普通变量传值时,形参分配了内存,不同于实参的内存地址,所以不会改变实参地址上的值,这种传值方式叫做"按值传递"。注意:形参中给出数组长度是没有意义的,编译器并不为它分配内存。

总结:
1) 形参数组和实参数组的类型必须一致,否则将引起错误。

2) 形参数组和实参数组的长度可以不相同,因为在调用时,只传送首地址而不检查形参数组的长度。

3) 在函数形参表中,允许不给出形参数组的长度,例如可以写为:

void nzp(int a[])
也可以用指针来代替:
void nzp(int *a)

函数指针:从概念上讲就是指向函数的指针在C语言中,一个函数总是占用一段连续的内存区域,函数名就是该函数所占内存区域的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数,然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为函数指针变量


函数指针变量定义的一般形式为:

数据类型 (*指针变量名)();
数据类型表示被指函数的返回值的类型,(*指针变量名)表示 * 后面的变量是指针变量,最后的空括号表示指针变量所指的是一个函数。例如:
int (*p)();
表示 p是一个指向函数入口的指针变量,该函数的返回值是整型。

总结一个规律:①定义指针变量    int(*p)(x,y); ②指向函数地址  p=abc;(abc是地址,abc();这是函数)③用函数指针变量调用函数   C=(*p)(x,y);(调用函数的一般形式:(*指针变量名)(实参列表);)

使用函数指针变量还应注意以下两点

  • 函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。
  • 函数调用中(*指针变量名)的两边的括号不可少,其中的*不应该理解为求值运算,在此处它只是一种表示符号。


1 0