1. 在源文件所有函数之外定义的变量称为全局变量,全局变量可以被所有源文件中的函数访问,它所占据的内存在程序执行期间一直存在,不会被释放。如果其它源文件需要使用在某个源文件中定义的全局变量时,要用extern关键字来修饰这个全局变量,说明变量已经在其它源文件中定义。如果在多个源文件中定义了相同名字的全局变量,则提示变量重复定义的错误。
2. 函数 一般来说,函数是通过return语句返回处理后的数据的,作用是数据输出,即压入到堆栈中,将函数调用后的返回值赋给某一变量,就是从堆栈中取出结果值。这是函数与外界交互的一个主要途径,即使用堆栈。
3. 在变量前加上static修饰符,可以产生static全局变量和static局部变量。static全局变量虽然是全局的,但不能被其它的源文件通过extern进行引用访问。static局部变量虽然具有局部性质,仅能被定义它的块内语句使用,但是当它的值在函数执行完毕,仍可以保留下来,下次再调用该函数访问该变量时,将使用上次函数执行后的变量值。
4. 指针变量用来存储某个地址的值,为了避免指针的危害,C++也提供了引用的用法,力求以更直观的同一个对象的指称在形式上遮蔽直接的指针变量使用。只用指针变量可以解决大量数据到函数的传递问题。
5. 将函数执行地址保存起来的变量成为函数指针变量,它的定义并不是按照一般的数据指针变过量的“类型 变量名”形式来定义的,而是采用接近于函数原形的形式来定义的,即 数据类型 (*函数指针变量名)(参数列表),以便编译器实行相关的赋值检查,下面为具体函数地址赋予函数指针变量。
int (*pFunc)(int); //定义一个函数指针变量
int Check(int); //一个具体的函数
pFunc = Check; //将函数Check的执行地址赋值给函数指针变量pFunc
函数指针变量的一个很大的作用就是,可以把函数作为函数的参数。看下面的例子:
// 如何将函数作为函数参数
#include <stdio.h>
#include <math.h>
//函数原型声明
double Sum(double (*pFunc)(double), double dStart, double dEnd);
//主函数
void main()
{
double dSum;
dSum = Sum(sin, 0.3,1.0);
printf("对位于[0.3, 1.0],范围内的角求sin和, sin 和= %f /n",dSum);
dSum = Sum(cos, 0.3,1.0);
printf("对位于[0.3, 1.0],范围内的角求cos和, cos 和= %f /n",dSum);
}
//子函数
double Sum(double (*pFunc)(double), double dStart, double dEnd)
{
double dSum = 0.0;
for(double d = dStart; d<dEnd; d+=0.1)
dSum += pFunc(d);
return dSum;
}
输出结果:
对位于[0.3, 1.0],范围内的角求sin和, sin 和= 4.715378
对位于[0.3, 1.0],范围内的角求cos和, cos 和= 6.202777
Press any key to continue
利用函数指针的另一个应用是:对于需要进行大量的分支处理程序,典型的做法是将相关处理程序全部集中在一个非常大的switch块中来进行,但会显得非常臃肿,不便于与其它模块进行交互,如果将所处理的函数的函数指针存放在数组或者堆栈中,然后通过取函数指针的方式进行函数的调用,可以大大提高代码的灵活性。如编译器的状态机处理和角色各种动作状态的处理都可以应用函数指针得到较好的灵活性。
#define N 100;
int people[N];
int (*pFunc)(int);
int move(int); //已经定义好的动作
pFunc = move;
people[0] = pFunc; //这个好像不对,将一个指针存放在数组里,怎么存放呢?
//应该是正确的,也就是说people[0]里存放的是函数指针变量的地址。