指针除了可以和一维数组、二维数组进行结合,也可以作为函数的返回值或者指向一个函数。下面就从这两个方面入手,看看指针与函数的有趣结合。
指针作为函数返回值
函数作为C语言的基本组成模块,包括函数首部和函数体两部分。函数首部由函数返回值类型、名字、参数类型、参数等组成;函数体又可以分为说明语句与执行语句。
1 | 返回值类型 函数名(形参类型 形参)//函数首部 |
其中返回值类型除了几种基本数据类型以外,还可以返回一个指针值,则该函数就称为指针类型的函数。
例如:
int *fun(int x)
该函数名为fun,fun两侧的运算符分别为“”和“()”,
由于“()”的优先级高于“”,故fun()首先代表一个函数
,然后与前面的“*”结合,表示返回值是一个指针,而int则表示该指针指向的数据类型为整型,即返回值为指向整型变量的指针类型。常见的返回指针值的函数有字符串复制函数。
1 | char *strcpy(char *s1,char *s2) |
运行结果为:
you
指针指向一个函数
在说明这个问题之前,先对函数在内存中的存储做个简单的介绍。指针之所以可以指向函数,是因为函数被分配在代码区一段连续的内存里面,函数名称存储的为该内存块的入口地址,故可以使用指针来调用函数。
当函数被调用时,函数的形参从右至左依次压入栈中,且连续。因此对于不确定参数个数的函数,只要取得了第一个形参的地址,就可以依次取得后面参数的值。这也是printf函数能够格式化打印任意个数变量值的原因,其参数从右至左依次压栈,输出时从左至右依次弹出。下面以
求n个数的最大值为例:
1 | int max(int n,int ...) |
其中n为要输入参数的个数,(&n+1)就得到了第一个待
比较数字的值,(&n+i)就得到了第i个待比较数字的值,i一直取到n。
下面继续,指向函数的指针变量的定义如下:
int (*p)();
首先(*p)说明p是一个指针变量,后面的()则代表了该指针指向为某一个函数,而int代表了该函数的返回值后为整型。
使用函数对该指针变量进行赋值操作:
p = funname;
则可以使用(*p)代替函数名funname进行函数调用。