大家好,又见面了,我是你们的朋友全栈君。
在C语言中,指针是一个很重要但是又很容易弄错的概念,也可以说指针就是C语言的灵魂,所以说学好指针对于完全掌握C语言是一个必须的过程。而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。
1. 指针函数
指针函数就是返回指针值的函数,本质是一个函数。所以指针函数等价于“返回值为指针的函数”。
声明形式:type *func (参数列表)
代码语言:javascript复制#include <iostream>
using namespace std;
int *GetNum(int x); //指针函数声明形式
void main(void)
{
cout << "===============start================" << endl;
int num;
cout << "Please enter the number between 0 and 6: ";
cin >> num;
cout << "result is:" << *GetNum(num) << endl; //输出返回地址块中的值
system("pause");
}
int *GetNum(int x) {
static int num[] = { 0,1,2,3,4,5,6 };
return &num[x]; //返回一个地址
}
2. 函数指针
函数指针就是一个指向函数的指针。每个函数在编译时,会被分配一个入口地址,一般用函数名来表示,这个地址就是该函数的指针。
声明形式:type (*func)(参数列表 )
从上面的定义形式可以看出,函数指针和指针函数的直观上区别在于指针符号*与函数名/指针名有没有用括号()包裹起来,从这一点来看是很容易区分两者的。
代码语言:javascript复制#include <iostream>
using namespace std;
int max(int a, int b) {
return a>b ? a : b;
}
void main(void)
{
cout << "===========start===========" << endl;
int(*func)(int, int); //定义一个指向该函数形式的指针变量
func = max;
int a, b;
cout << "Please enter two numbers:";
cin >> a >> b;
cout << "max=" << (*func)(a, b) << endl; //运用指针变量调用函数
cout << "max=" << max(a, b) << endl; //使用原函数调用
cout << "max=" << func(a, b) << endl; //使用函数指针名调用,func = max
system("pause");
}
上例给出了函数指针的两种最普遍的调用形式,一个是直接用定义的指针变量(* func)调用,一个是用指针名调用,后者看起来就像是将原函数使用了新名称去调用一样,可以看成函数的别名。再次强调一下:指针变量名和指针符号 * 一定要用括号包裹起来。函数指针还有一种常用的使用方式,就是使用typedef定义后再使用。将上例稍作修改如下:
代码语言:javascript复制#include <iostream>
using namespace std;
int max(int a, int b) {
return a>b ? a : b;
}
typedef int(*func)(int, int);
void main(void)
{
cout << "===========start===========" << endl;
func maxfunc = max;
int a, b;
cout << "Please enter two numbers:";
cin >> a >> b;
cout << "max=" << (*maxfunc)(a, b) << endl; //运用指针变量调用函数
cout << "max=" << max(a, b) << endl; //使用原函数调用
cout << "max=" << maxfunc(a, b) << endl; //使用函数指针名调用,func = max
system("pause");
}
3. 函数指针数组
顾名思义,就是每个元素都是函数指针的数组,直接在函数指针名后面加上数组符号[ ]即可。
声明形式:type (*func[ ])(参数列表 )
代码语言:javascript复制#include<iostream>
using namespace std;
void fun1()
{
cout << "调用函数fun1" << endl;
}
void fun2()
{
cout << "调用函数fun2" << endl;
}
void fun3()
{
cout << "调用函数fun3" << endl;
}
int main()
{
//定义三个函数指针
void(*pfun)() = &fun1;
void(*pfun2)() = &fun2;
void(*pfun3)() = &fun3;
//接下来就是定义一个数组把他们三个装进去。
void(*pfunarr[3])();
void(*pfunarr[3])();
pfunarr[0] = pfun;
pfunarr[1] = pfun2;
pfunarr[2] = pfun3;
/* 或者这样赋值 pfunarr[0] = &fun1; pfunarr[1] = &fun2; pfunarr[2] = &fun3; */
//调用运行
pfunarr[0]();
pfunarr[1]();
pfunarr[2]();
/* 或者这样调用 (*pfunarr[0])(); (*pfunarr[1])(); (*pfunarr[2])(); */
system("pause");
return 0;
}
4. C语言函数不可以定义为数组,只能通过函数指针来操作定义函数指针数组。
5. 指向函数指针数组的指针
声明形式:type (* (*func )[ ])(参数列表 )
代码语言:javascript复制#include<iostream>
using namespace std;
void fun1()
{
cout << "调用函数fun1" << endl;
}
void fun2()
{
cout << "调用函数fun2" << endl;
}
void fun3()
{
cout << "调用函数fun3" << endl;
}
int main()
{
//void(*pfun)() = &fun1;
//void(*pfun2)() = &fun2;
//void(*pfun3)() = &fun3;
//接下来就是定义一个数组把他们三个装进去。
void(*pfunarr[3])();
void(*(*pfunarr2)[3])();
//在这里呢看着个指针数组,他就是一个具有3个以函数指针为内容的元素的函数指针数组。
pfunarr[0] = &fun1;
pfunarr[1] = &fun2;
pfunarr[2] = &fun3;
pfunarr2 = &pfunarr;
(*pfunarr2)[0]();
pfunarr[0]();
system("pause");
return 0;
}
分析其定义形式:void(*(*pfunarr2)[3])() 其中(* pfunarr2)[3]表示数组指针,而void(* )( )表示函数指针,两者结合起来就是指向函数指针数组的指针。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/152169.html原文链接:https://javaforall.cn