塘沽建设网站,网站费做进什么科目,肥城网站网站建设,外贸网站建设内容一、函数指针变量
什么是函数指针变量呢#xff1f;
既然是指针变量#xff0c;那么它指向的一定是地址#xff0c;而且我们可以通过地址来调用函数的。
函数是否有地址呢#xff1f;地址是什么#xff1f; 经过上面的测试可以看到函数也是有地址的#xff0c;而且其地…一、函数指针变量
什么是函数指针变量呢
既然是指针变量那么它指向的一定是地址而且我们可以通过地址来调用函数的。
函数是否有地址呢地址是什么 经过上面的测试可以看到函数也是有地址的而且其地址就是函数名当前是x86环境这样地址值相对较短更容易分辨。
1、函数地址的存储
与数组相似函数的地址存储也是需要使用指针变量来进行存储的。 这里是结果
006F13CA
006F13CA
经过我们上面的代码演示可以看到函数的地址已经被指针p存储了起来那我们该如何使用他们呢
2、函数地址的使用
同样我们使用一个代码来清晰的解释如何使用这个话题 可以看到我们在这里仅使用指针就可以对函数进行访问并使用提一嘴int(*p)(int, int) Add;这里的int,int可以在后面加上变量但是不加减少了变量的创建同时也使得代码更简洁。
我们根据上面以及之前所学习到的所有知识来看下面两段代码出自《C陷阱和缺陷》这本书
(*(void (*)())0)();
看到这是不是有点蒙没关系我来给你逐词解释一下首先说明这段代码是不可以运行的 不知道大家对此能否理解呢
我们来看另外一个
void (*signal(int , void(*)(int)))(int);
如果可以理解上面的话下面这段就可以很容易理解了吧还是给大家解释一下 二、typedef关键字
简单说这个关键字的意思就是重定义一个类型的名字。
例如 这两个ab都使用%d 的格式来进行打印都是没有问题的但是好像没什么用啊
其实对于当前代码量较少类型也比较简单的状态确实没有什么用处但是当后期学习的更多了就能明白这个的重要性了比如一个很长的代码中我们要将其中所有的int类型的数据改成double类型此时我们只需要在上面进行更改即可一次更改后面的所有的int类型的数据都会更改为double类型就不需要再一个一个慢慢的改了
这个typedef关键字在对函数指针和指针数组在更改时是有所不同的 在对指针数组和函数指针进行重定义时需要将重定义后的类型放在*的右面。
三、函数指针 数组
要把函数的地址存放到一个数字中那这个数组就叫函数指针数组那函数指针的数组怎么定义呢 int (*parr1[3])(); 这就是它的定义怎么理解呢 parr1先和[]结合说明parr1是数组数组的内容是什么呢是int(*)()类型的函数指针。 以下就是本文的所有代码了需要的朋友自取哦 制作不易请点个赞再走吧。 #define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h//void test()
//{
//
//}
//int Add(int x, int y)
//{
// return x y;
//}
//int main()
//{
// int x 0, y 0;
// Add(x,y);
// //这里要将解引用操作符和p使用括号括起来主要目的是明确优先级和避免歧义
// int(*p)(int, int) Add;
// printf(%p\n, p);
// printf(%p\n, Add);
// //printf(%p\n, test);
// //printf(%p\n, test);
// return 0;
//}
//int Add(int x, int y)
//{
// return x y;
//}
//int main()
//{
// int(*p)(int, int) Add;
// printf(%d\n, p(2, 3));
// printf(%d\n, (*p)(2, 3));
// (*(void (*)())0)();
// void (*signal(int, void(*)(int)))(int);
// return 0;
//}//typedef int INT;
//typedef int(*arr_t)[5];
//typedef int(*ptr_t)(int);
//int p1(int a)
//{
//
//}
//ptr_t p2(int a)
//{
//
//}
//int main()
//{
// //int a 0;
// //INT b 3;
// int* arr[] { 0 };
// arr_t n[] { 0 };
// printf(%d\n, arr[0]);
// printf(%d\n, n[0]);
// printf(%p\n, p1);
// printf(%p\n, p2);
// //printf(%d\n, a);
// //printf(%d\n, b);
// return 0;
//}int main()
{int (*parr1[3])(); //parr1 先和[] 结合说明 parr1是数组数组的内容是什么呢是 int (*)() 类型的函数指针。return 0;
}