当前位置: 首页 > wzjs >正文

网站制作哪种好国内搜索引擎排名

网站制作哪种好,国内搜索引擎排名,做网商哪个国外网站好,厦门网站建设开发在经过前几篇的复习后我们已经了解了大部分指针的类型,今天让我们继续复习指针的其他内容吧. 函数指针变量 函数指针变量的创建 什么是函数指针变量呢?函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的。 那么函数是否有地址呢&#x…

        在经过前几篇的复习后我们已经了解了大部分指针的类型,今天让我们继续复习指针的其他内容吧.

函数指针变量

  函数指针变量的创建

        什么是函数指针变量呢?函数指针变量应该是⽤来存放函数地址的,未来通过地址能够调⽤函数的。 那么函数是否有地址呢?让我们看下下面的测试及结果.

        所以函数是有地址的,函数名就是函数的地址,当然也可以通过 &函数名的方式获得函数的地址.如果我们要将函数的地址存放起来,就得创建函数指针变量.函数指针变量的形式和数组指针很相似.见下函数指针类型解析.代码与下个模块合并在下面.

  函数指针变量的使用

        通过函数指针调⽤指针指向的函数,具体见下

int Add(int x, int y)
{return x + y;
}
int main()
{int (*p)(int x, int y) = Add;int (*p1)(int, int) = Add;//上面两种写法都可以 都是函数指针,参数可以写实参名也可以不写实参名int a = (*p)(1, 2);int b = p(1, 2);int a1 = (*p1)(1, 2);int b1 = p1(1, 2);printf("%d %d\n", a, b);printf("%d %d\n", a1, b1);return 0;
}

         接下来可以看下来两段有趣的代码-CSDN博客更加深入的理解函数指针和了解typedef.

函数指针数组

        那要把函数的地址存到⼀个数组中,那这个数组就叫函数指针数组,那么函数指针的数组如何定义呢?

int (*parr1[3])();

转移表

        函数指针数组的⽤途:转移表.

        下面用计算器的实现来举例一下.

        一般实现:

int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x - y;
}
int Div(int x, int y)
{return x / y;
}
int Mul(int x, int y)
{return x * y;
}
void menu()
{printf("****************\n");printf("**1,add  2,sub**\n");printf("**3,div  4,mul**\n");printf("*****0,exit*****\n");printf("****************\n");
}
int main()
{int n = 0;do{menu();printf("请选择\n");scanf("%d", &n);switch (n){case 1:{printf("输入操作数\n");int a, b;scanf("%d%d", &a, &b);printf("%d\n", Add(a, b));break;}case 2:{printf("输入操作数\n");int a, b;scanf("%d%d", &a, &b);printf("%d\n", Sub(a, b));break;}case 3:{printf("输入操作数\n");int a, b;scanf("%d%d", &a, &b);printf("%d\n", Div(a, b));break;}case 4:{printf("输入操作数\n");int a, b;scanf("%d%d", &a, &b);printf("%d\n", Mul(a, b));break;}case 0:{printf("退出\n");return 0;}default:printf("重新选择\n");}} while (n);return 0;
}

        在上面实现中,我们可以看见下面这段代码反复出现,改变的只有调用的函数.

 printf("输入操作数\n");
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", Add(a, b));
break;

        下面我们来改进一下:

int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x - y;
}
int Div(int x, int y)
{return x / y;
}
int Mul(int x, int y)
{return x * y;
}
void menu()
{printf("****************\n");printf("**1,add  2,sub**\n");printf("**3,div  4,mul**\n");printf("*****0,exit*****\n");printf("****************\n");
}
int main()
{int n = 0;do{menu();printf("请选择\n");scanf("%d", &n);int(*arr[5])(int, int) = { NULL,Add,Sub,Div,Mul };if (n > 0 && n <= 4){printf("输入操作数\n");int a, b;scanf("%d%d", &a, &b);printf("%d\n", arr[n](a, b));}else if (0 == n){printf("退出\n");}else{printf("重新选择\n");}} while (n);return 0;
}

        改进之后重复的代码就减少了,取代的是将函数指针放进数组中,这就是转移表.

回调函数是什么?

        回调函数就是⼀个通过函数指针调⽤的函数.

        如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。回调函数不是由该函数的实现⽅直接调⽤,⽽是在特定的事件或条 件发⽣时由另外的⼀⽅调⽤的,⽤于对该事件或条件进⾏响应。

        继续用上面计算器的例子,依旧是冗余代码的处理.下面用回调函数的方式处理一下.

int Add(int x, int y)
{return x + y;
}
int Sub(int x, int y)
{return x - y;
}
int Div(int x, int y)
{return x / y;
}
int Mul(int x, int y)
{return x * y;
}
void menu()
{printf("****************\n");printf("**1,add  2,sub**\n");printf("**3,div  4,mul**\n");printf("*****0,exit*****\n");printf("****************\n");
}
void func(int (*p)(int, int))
{printf("输入操作数\n");int a, b;scanf("%d%d", &a, &b);printf("%d\n",p(a, b));
}
int main()
{int n = 0;do{menu();printf("请选择\n");scanf("%d", &n);switch (n){case 1:func(Add);break;case 2:func(Sub);break;case 3:func(Div);break;case 4:func(Mul);break;case 0:{printf("退出\n");return 0;}default:printf("重新选择\n");}} while (n);return 0;
}

        因为冗余的代码,只有调⽤函数的逻辑是有差异的,我们可以把调⽤的函数的地址以参数的形式传递过去,使⽤函数指针接收,函数指针指向什么函数就调⽤什么函数,这⾥其实使⽤的就是回调函数的功能。

qsort使用举例

        首先让我们看下qsort的函数原型

void qsort (void* base, size_t num,size_t size,int (*compar)(const void*,const void*));

如上所示qsort有四个参数,第一个是要排序的数据的起始位置

                                        第二个是要排序的个数

                                        第三个是要排的数据的大小

                                        第四个是传入比较要排数据排序方法的指针

                                        (当第一个参数<第二个时返回小于0的值,

                                         相等返回0,大于返回大于0的值)

        下面让我们来看一下它的应用.

// 排列整型
int cmp(void* p1, void* p2)
{return (*(int*)p1) - (*(int*)p2);
}
int main()
{int arr[10] = { 3,6,7,4,1,5,2,9,0,8 };int sz = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}printf("\n");qsort(arr, sz, sizeof(arr[0]), cmp);for (int i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}
struct Stu 
{char name[20];//名字int age;//年龄
};//假设按照年龄来⽐较
int cmp_stu_by_age(const void* e1, const void* e2)
{return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}//假设按照名字来⽐较
int cmp_stu_by_name(const void* e1, const void* e2)
{return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}//按照年龄来排序
void test1()
{struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
}
//按照名字来排序
void test2()
{struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };int sz = sizeof(s) / sizeof(s[0]);qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{test1();test2();return 0;
}

        以上就是今天的复习了.我们下篇复习笔记见~

http://www.dtcms.com/wzjs/313780.html

相关文章:

  • 做计算机网站seo顾问
  • 网站建设与维护的实训总结适合女生去的培训机构
  • 杭州网站制作哪家好广州网站优化推广
  • 网站定制公司地址网络平台推广具体是怎么推广
  • 网站集约化建设2019年4月nba最新排行
  • wordpress创建数据库错误seo搜索引擎优化试题及答案
  • 烟台网站建设策划方案新网站百度收录要几天
  • 成都摄影网站建设pc网站建设和推广
  • 建立网站需要多少钱怎么样宁波关键词优化企业网站建设
  • 酷站海洛互联网搜索引擎有哪些
  • 国外网站A网络营销的重要性
  • 建材外贸网站建设重庆网站seo服务
  • 怎样把建好的网站上传到互联网搜索引擎优化实训
  • 河南官网网站建设报价uc浏览器关键词排名优化
  • 企业做网站分一般为哪几种类型网站优化排名哪家好
  • 蓝色清新phpcms企业网站模板职业培训机构
  • 做视频网站该把视频文件传到哪长尾关键词挖掘熊猫
  • 湖北网站建设 鄂 icp网站优化的方法
  • 自己做网站导航自助优化排名工具
  • 建设一个有影响力的网站百度经验官网入口
  • html导航栏模板四川seo整站优化
  • 做一个介绍网站多少钱直通车推广
  • 台州手机端建站模板福州seo扣费
  • 新疆示范工程建设服务平台网站网站定制的公司
  • 电子商务网站建设方案书科学新概念seo外链平台
  • 做鸡直播网站深圳互联网公司排行榜
  • 东莞建设网站的位置百度指数分析案例
  • 有专门做牙膏的网站吗海外营销推广
  • 编程和做网站那个号政府免费培训 面点班
  • 网站建设 定制武汉网站排名推广