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

成都市新津县建设局官方网站温州大都市建设开发有限公司网站

成都市新津县建设局官方网站,温州大都市建设开发有限公司网站,做平面有什么好的网站,龙城区建设局网站指针进阶 函数指针数组指向函数指针数组的指针回调函数指针和数组经典题目的解析 函数指针数组 数组是一个存放相同类型数据的存储空间#xff0c;那我们已经学习了指针数组#xff0c; 比如#xff1a; int* arr[10];//数组的每个元素是int*那要把函数的地址存到一个数组… 指针进阶 函数指针数组指向函数指针数组的指针回调函数指针和数组经典题目的解析 函数指针数组 数组是一个存放相同类型数据的存储空间那我们已经学习了指针数组 比如 int* arr[10];//数组的每个元素是int*那要把函数的地址存到一个数组中那这个数组就叫函数指针数组。那下面哪一个是函数指针数组呢 int (*parr1[10])(); int* parr2[10](); int (*)() parr3[10];答案是parr1。 parr1 先和 [] 结合说明 parr1是数组数组的内容是什么呢 是 int (*)() 类型的函数指针。 函数指针数组的用途转移表。 请看下面的一个简单计算器的实例 int add(int a, int b) {return a b; } int sub(int a, int b) {return a - b; } int mul(int a, int b) {return a * b; } int div(int a, int b) {return a / b; } int main() {int x, y;int input 1;int ret 0;do{printf(\n);printf( 1:add 2:sub \n);printf( 3:mul 4:div \n);printf(\n);printf(请选择);scanf(%d, input);switch (input){case 1:printf(请输入操作数);scanf(%d %d, x, y);ret add(x, y);printf(ret %d\n, ret);break;case 2:printf(请输入操作数);scanf(%d %d, x, y);ret sub(x, y);printf(ret %d\n, ret);break;case 3:printf(请输入操作数);scanf(%d %d, x, y);ret mul(x, y);printf(ret %d\n, ret);break;case 4:printf(请输入操作数);scanf(%d %d, x, y);ret div(x, y);printf(ret %d\n, ret);break;case 0:printf(退出程序\n);break;default:printf(选择错误\n);break;}} while (input);return 0; }那么用函数指针数组怎么实现呢请看下面的代码 int add(int a, int b) {return a b; } int sub(int a, int b) {return a - b; } int mul(int a, int b) {return a * b; } int div(int a, int b) {return a / b; } int main() {int x, y;int input 1;int ret 0;//函数指针数组int(*p[5])(int x, int y) { NULL, add, sub, mul, div }; //转移表while (input){printf(\n);printf( 1:add 2:sub \n);printf( 3:mul 4:div \n);printf(\n);printf(请选择);scanf(%d, input);if ((input 4 input 1)){printf(请输入操作数);scanf(%d %d, x, y);ret (*p[input])(x, y);}elseprintf(输入有误\n);printf(ret %d\n, ret);}return 0; }指向函数指针数组的指针 指向函数指针数组的指针是一个 指针 指针指向一个 数组 数组的元素都是 函数指针 。我们来看下面的代码 int (*pf)(int, int);//函数指针int (*pfArr[5])(int, int);//函数指针数组//pfArr函数指针数组的地址p就是指向函数指针数组的指针int (*(*p)[5])(int, int) pfArr;解析p先和 * 结合说明是一个指针之后与[]结合说明是一个数组指针再与*结合说明用一个指针指向了数组指针之后又指向了一个函数的地址该函数有两个int类型参数返回值是int。 总而言之指向函数指针数组的指针就是在函数指针数组的基础上再加一个 * 表示一个指针去指向它。 回调函数 回调函数就是一个通过函数指针调用的函数。如果你把函数的指针地址作为参数传递给另一个函数当这个指针被用来调用其所指向的函数时我们就说这是回调函数。回调函数不是由该函数的实现方直接调用而是在特定的事件或条件发生时由另外的一方调用的用于对该事件或条件进行响应。 首先演示一下qsort函数的使用 #include stdlib.h//qsort需要引入头文件 int int_cmp(const void * p1, const void * p2) {return (*( int *)p1 - *(int *) p2); } int main() {int arr[] { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };int sz sizeof(arr) / sizeof(arr[0]);int i 0;qsort(arr, sz, sizeof (int), int_cmp);for (i 0; i sz; i){printf( %d , arr[i]);}printf(\n);return 0; }使用回调函数模拟实现qsort采用冒泡的方式 int int_cmp(const void* p1, const void* p2) {return (*(int*)p1 - *(int*)p2); } void swap(void* p1, void* p2, int size) {int i 0;for (i 0; i size; i){char tmp *((char*)p1 i);*((char*)p1 i) *((char*)p2 i);*((char*)p2 i) tmp;} } void bubble(void* base, int count, int size, int(*cmp)(void*, void*)) {int i 0;int j 0;for (i 0; i count - 1; i){for (j 0; j count - i - 1; j){if (cmp((char*)base j * size, (char*)base (j 1) * size) 0){swap((char*)base j * size, (char*)base (j 1) * size, size);}}} } int main() {int arr[] { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };//char *arr[] {aaaa,dddd,cccc,bbbb};int i 0;int sz sizeof(arr) / sizeof(arr[0]);bubble(arr, sz, sizeof(int), int_cmp);for (i 0; i sz; i){printf(%d , arr[i]);}printf(\n);return 0; }void* 的指针是无具体类型的指针它可以接收任意类型的地址这种类型的指针是不能直接进行解引用操作也不能直接进行指针运算。 测试qsort排序结构体数据 struct Stu {char name[10];int age; }; //按年龄排序 int cmp_stu_age(const void* p1, const void* p2) {return ((struct Stu*)p1)-age - ((struct Stu*)p2)-age; } //按姓名排序 int cmp_stu_name(const void* p1, const void* p2) {return strcmp(((struct Stu*)p1)-name, ((struct Stu*)p2)-name); } int main() {struct Stu arr[] { {zhangsan, 17}, {lisi, 18},{wangwu, 15} };int sz sizeof(arr) / sizeof(arr[0]); qsort(arr, sz, sizeof(arr[0]), cmp_stu_age);int i 0;for (i 0; i sz; i) {printf(%d\n, arr[i].age);}return 0; }指针和数组经典题目的解析 数组名是数组首元素的地址但有两个例外 1.sizeof(数组名)这里的数组名表示整个数组计算的是整个数组的大小单位是字节。 2.数组名这里的数组名表示的是整个数组取出的是整个数组的地址。 请看下面的题目 //一维数组 int a[] {1,2,3,4}; printf(%d\n,sizeof(a));//4*416字节 printf(%d\n,sizeof(a0));//数组名a是数组首元素地址a0还是首地址地址大小为4/8字节 printf(%d\n,sizeof(*a));//数组名a是数组首元素地址*a就是首元素大小为4字节 printf(%d\n,sizeof(a1));//数组名a是数组首元素地址a1就是第二个元素的地址大小为4/8字节 printf(%d\n,sizeof(a[1]));//数组第二个元素大小为4字节 printf(%d\n,sizeof(a));//a是数组的地址数组的地址也是地址大小为4/8字节 printf(%d\n,sizeof(*a));//*和相互抵消所以*a相当于a所以大小为16个字节 printf(%d\n,sizeof(a1));//a是整个数组的地址a1就是跳过整个数组但结果任然是一个地址大小为4/8字节 printf(%d\n,sizeof(a[0]));//表示首元素地址大小为4/8个字节 printf(%d\n,sizeof(a[0]1));//表示第二个元素的地址大小为4/8个字节//字符数组 char arr[] {a,b,c,d,e,f}; printf(%d\n, sizeof(arr));//arr表示整个数组计算的是整个数组的大小总共6个字节 printf(%d\n, sizeof(arr0));//arr表示数组首元素的地址arr0还是数组首元素的地址是地址就是4/8个字节 printf(%d\n, sizeof(*arr));//arr表示数组首元素的地址,*arr就是首元素大小1个字节 printf(%d\n, sizeof(arr[1]));//arr[1]就是数组第二个元素大小是1个字节 printf(%d\n, sizeof(arr));//arr是数组的地址但是数组的地址也是地址是地址就是4/8个字节 printf(%d\n, sizeof(arr1));//arr 1是跳过整个数组后的地址是地址就是4/8个字节 printf(%d\n, sizeof(arr[0]1));//表示第二个元素的地址是4/8个字节printf(%d\n, strlen(arr));//因为字符数组arr中没有\0所以在求字符串长度的时候会一直往后找直到找到\0所以结果就是随机值 printf(%d\n, strlen(arr0));//arr 0是首元素的地址和第一个一样也是随机值 printf(%d\n, strlen(*arr));//error //strlen函数参数的部分需要传一个地址当我们传递的是a时a的ASCII码值是97那就是将97作为地址传参就会从97这个地址开始统计字符串长度这就非法访问内存了 printf(%d\n, strlen(arr[1]));//error 原因同上 printf(%d\n, strlen(arr));//arr是数组的地址,数组的地址和数组首元素的地址值是一样的那么传递给strlen函数后依然是从数组的第一个元素的位置开始往后统计 printf(%d\n, strlen(arr1));//原因同上也是随机值 printf(%d\n, strlen(arr[0]1));//arr[0] 1是第二个元素的地址。结果也是随机值char arr[] abcdef;//等价于[a b c d e f \0] printf(%d\n, sizeof(arr));//7个字节 printf(%d\n, sizeof(arr0));//arr 0是首元素的地址大小1个字节 printf(%d\n, sizeof(*arr));//*arr其实就是首元素,大小1个字节 printf(%d\n, sizeof(arr[1]));//arr[1]是第二个元素大小1个字节 printf(%d\n, sizeof(arr));//arr是数组的地址是地址就是4/8个字节 printf(%d\n, sizeof(arr1));//arr 1是跳过一个数组的地址结果仍然是地址大小为4/8个字节 printf(%d\n, sizeof(arr[0]1));//arr[0] 1是第二个元素的地址 大小为4/8个字节printf(%d\n, strlen(arr));//6 printf(%d\n, strlen(arr0));//6 printf(%d\n, strlen(*arr));//error printf(%d\n, strlen(arr[1]));//error printf(%d\n, strlen(arr));//6 printf(%d\n, strlen(arr1));//跳过整个数组向后数后面是未知的所以结果是随机值 printf(%d\n, strlen(arr[0]1));//从第二个元素往后数长度为5char* p abcdef; printf(%d\n, sizeof(p));//p是一个指针变量大小就是4/8个字节 printf(%d\n, sizeof(p1));//p1是b的地址是地址大小就是4/8个字节 printf(%d\n, sizeof(*p));//*p 就是a大小就是1个字节 printf(%d\n, sizeof(p[0]));//p[0]-- *(p0) -- *p 大小1个字节 printf(%d\n, sizeof(p));//p -- char** 大小4/8个字节 printf(%d\n, sizeof(p1));//直接跳到字符串后面的实际还是地址大小4/8个字节 printf(%d\n, sizeof(p[0]1));//p[0] 1得到是b的地址大小4/8个字节printf(%d\n, strlen(p));//6 printf(%d\n, strlen(p1));//5 printf(%d\n, strlen(*p));//error printf(%d\n, strlen(p[0]));//error printf(%d\n, strlen(p));//随机值 printf(%d\n, strlen(p1));//随机值 printf(%d\n, strlen(p[0]1));//5//二维数组 int a[3][4] {0}; printf(%d\n,sizeof(a));//3*4*4 48 printf(%d\n,sizeof(a[0][0]));//4 printf(%d\n,sizeof(a[0]));//a[0]是第一行这个一维数组的数组名数组名算是单独放在sizeof内部了计算的是整个数组的大小大小是16个字节 printf(%d\n,sizeof(a[0]1));//a[0]作为第一行的数组名没有单独放在sizeo内部没有a[0]表示数组首元素的地址也就是a[0][0]的地址所以a[0]1是第一行第二个元素的地址是地址就是4/8个字节 printf(%d\n,sizeof(*(a[0]1)));//计算的是第一行第2个元素的大小为4个字节 printf(%d\n,sizeof(a1));//a是数组首元素的地址是第一行的地址a1就是第二行的地址是地址大小就是4/8个字节 它的类型是int(*)[4] printf(%d\n,sizeof(*(a1)));//*(a1) -- a[1] - sizeof(*(a1))-sizeof(a[1]) 计算的是第二行的大小就是16个字节 printf(%d\n,sizeof(a[0]1));//a[0]是第一行的地址a[0]1 是第二行的地址是地址大小就是4/8个字节 printf(%d\n,sizeof(*(a[0]1)));//计算的是第二行的大小16个字节 printf(%d\n,sizeof(*a));//a是数组首元素的地址就是第一行的地址*a 就是第一行*a -- *(a0) -- a[0]大小为16个字节 printf(%d\n,sizeof(a[3]));//第三行的大小16个字节总结 sizeof(数组名)这里的数组名表示整个数组计算的是整个数组的大小。数组名这里的数组名表示整个数组取出的是整个数组的地址。除此之外所有的数组名都表示首元素的地址。
http://www.pierceye.com/news/353784/

相关文章:

  • 简单的网站建设找哪个公司新网站seo技术
  • 电子网址怎么创建下载优化大师app
  • 网站上传服务器教程wordpress 开启多用户
  • 做网站的公司重庆互联网营销方式
  • 在线探测网站开发语言东莞人才市场现场招聘会地址
  • 检测网站是否被挂黑链seo网站营销推广
  • 当今网站开发技术的现状自己做的网站怎么上排行榜
  • 外贸没有公司 如何做企业网站?成都市住房和城乡建设局官网查询
  • 公证网站建设管理无锡百度正规推广
  • 免费海外网站建设自学设计软件的免费网站
  • 个人姓名最多备案多少个网站外贸网站制作公司
  • 上海市建设安全协会官方网站上海人才网官网公示
  • 原创文章网站wordpress注册页面修改密码
  • 山东省建设注册执业中心网站博物馆网站做的最好的
  • 做论坛网站能赚钱吗山东济南网站建设公司
  • 建网站海外英文建站
  • 学网站开发网页制作苏州模板建站哪家好
  • 音乐网站建设怎么上传音乐易点租电脑租赁官网
  • 做足球网站前景一个网站源码值多少钱
  • 成都网站排名优化公司上海创意网站建设
  • 贵阳市住房城乡建设局八大员网站wordpress 输出 文章时间
  • 那个装修公司的网站做的好想创业去哪里找项目
  • 公选课网页制作与网站建设网页游戏平台十大排名
  • 无锡锡牛网站建设网站倒计时
  • 南通做外贸网站网站建设培训四川
  • 微小店适合卖做分类网站吗手机开发者网站
  • 广州建企业网站网页设计是啥意思
  • wap手机网站建设刀模 东莞网站建设
  • 怎样做网站的外链做推广优化的网站有哪些内容
  • 永嘉规划建设局网站备案个人网站做淘宝客