热 综合-网站正在建设中,分销商管理系统,网站做支付接口吗,苏州seo全网营销❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主#xff0c;代码兴国#xff01;❤❤❤ 许久不见#xff0c;甚是想念#xff0c;真的是时间时间#xff0c;你慢些吧#xff0c;不能再让头发变秃… ❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主代码兴国❤❤❤ 许久不见甚是想念真的是时间时间你慢些吧不能再让头发变秃了 我愿用我一生换我头发常青~~(^▽^ )。好的好的今天是12月31号是2023年的最后一天博主这里提前祝大家新年快乐 最后一天了 博主在这里问各位铁汁们一句“2022年定下的目标2023年都实现了吗2023又要为2024定什么目标呢” 或许有些铁汁会骄傲的拍拍胸脯说“何止实现了我还超了呢”或许也有铁汁会说“嗐2023年因为这样那样的原因没有能完成去年定的目标很后悔” 其实无论你是处在哪种阶段博主只想说“向前看吧过去的已经不存在了过去一年里你是荣华富贵或是灰头土脸又如何难道以后就不会改变了吗就像我们头上的头发终有一天也会变白脱落但是生活不还得继续吗所以抛下顾虑放下过去的荣辱在新的一年里继续努力为更好的未来而前进吧” 鸡汤虽多但不喝也无用。所以为了更好的未来我们铁汁们还是需要继续学习的是吧还会继续给大伟点赞收藏继续支持大伟的对吧~对吧~对吧~ヾ(≧▽≦*)o 呃哼我们今天来看看C语言的核心指针的最后一篇。今天我们要学的知识是没了。 啊不是应该是有关指针的内容基本没了这一篇主要是一些扩展别误解哦~ 好的今天要学的内容是回调函数qsort使用和模拟实现最后是有关指针的笔试题。 诶但是在开始之前我们先谈一谈上一篇博客最后提到的两段代码什么不记得了?哼就知道会发生这种情况快去看—————指针(part three) 一.
(*(void (*)())0)(); 大家整体看这段代码是不是难于理解那如果我们把它分为几个区块从内部一个一个分析呢
void (*)() 这是一个函数指针的声明。它声明了一个指向不带参数void并返回 void 的函数的指针
(void (*)())0 这是将整数 0 转换为指定类型的函数指针
(*(void (*)())0) 这对函数指针进行了解引用。它将地址为 0 的值视为函数并调用它 简单来说这段代码试图调用内存地址为 0 处的函数 怎么说铁汁们从内部一步一步分解是不是就会相对好理解了里面的内容其实是我们已经学过的知识的集合体啊对不对。 二.那么根据以上的思路兄弟们自己再试图理解理解下面这个代码 void (*signal(int , void(*)(int)))(int); ——————————————————————————————————————————
signal
这是一个函数名
int 这是signal函数的第一个参数表示信号编号
void(*)(int) 这是signal函数的第二个参数是一个函数指针。它表示指向一个接受int参数并返回void的函数的指针。这个函数指针是信号处理函数指定了在接收到信号时应采取的操作
(*signal(int, void(*)(int))) 这部分表示signal是一个接受两个参数并返回某种结果的函数。声明的最外层指定了返回的类型
void(*)(int) 这指定了signal函数的返回类型。它是一个函数指针指向一个接受int参数并返回void的函数。这与signal返回信号处理函数的函数指针的概念一致 综合起来signal函数接受两个参数一个表示信号编号的int一个表示信号处理函数的函数指针。它返回一个类型为void (*)(int)的函数指针 OK这里把上一篇博客遗留下的问题解决了现在开始这次的内容 回调函数 定义回调函数就是⼀个通过函数指针调⽤的函数
简单来说就是在函数内定义了另一个函数 如
int add(int a, int b)
{return a b;
}
void calc(int(*pf)(int, int))
{int ret 0;int x, y;printf(输⼊操作数);scanf(%d %d, x, y);ret pf(x, y);printf(ret %d\n, ret);
}
int main()
{
calc(add);
return 0;
} calc函数接受一个函数指针 pf该指针指向一个接受两个整数参数并返回整数的函数。 qsort使用及实现 以下是qsort函数的使用演示
#include stdio.h
//qosrt函数的使⽤者得实现⼀个⽐较函数
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 i 0;qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);for (i 0; i sizeof(arr) / sizeof(arr[0]); i){printf(%d , arr[i]);}return 0;
}以下是cpp官方给的qsort的解释 其中的四个元素 还是那句话虽然我们程序猿不需要多好的英语但是我们以后是需要看各种英文的文献的所以我们从现在开始就要逐渐适应读英文的文章。 简单来说qsort函数内部第一个元素要排序的数组名第二个元素数组的大小第三个元素数组内存储的类型的字节大小第四个元素一个cmp函数函数内实现的是两个指针的对比。如上*a -*b为升序,*b - *a 为降序*a *b 为升序*a *b 为降序 拓展一下qsort库函数底层是快排时间复杂度是O(N*logN) ,在我们刷题的时候还蛮经常用的。 那现在我们来对qsort函数进行个模拟实现当然是以冒泡的方法所以时间复杂度是O(N*N)。那我们来看看吧
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; jcount-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 };int i 0;bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);for (i 0; i sizeof(arr) / sizeof(arr[0]); i){printf(%d , arr[i]);}printf(\n);return 0;
}这个模拟实现是完全按照官方给的元素来写的浓度比较高大家好好吸收哦~ 指针笔试题 其实的话到这里有关指针的内容已经可以结束了但是呢学而不思则罔学会了还需要大量的练习正如前段时间网上比较火的 题目是做不完的但是知识点是固定的博主这里给大家出三道题大家珍惜哦~ 一.
int main()
{int aa[2][5] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int *ptr1 (int *)(aa 1);int *ptr2 (int *)(*(aa 1));printf( %d,%d, *(ptr1 - 1), *(ptr2 - 1));return 0;
} 解析aa1越过了整个二维数组aa所以ptr1指向的是二维数组后面的那个元素然后ptr-1指向的是10而aa1越过了整个二维数组的第一行ptr2指向的是6ptr2-1指向的是aa第一行的最后一个元素5。 答案就是10和5 二.
int main()
{char *a[] {work,at,alibaba};char**pa a;pa;printf(%s\n, *pa);return 0;
} 定义了一个指针数组*a[]又定义了一个二级pa指向a的首元素“work”pa也就是a向后走一个元素此时*pa就是“at”。 答案就是at 三.
int main()
{char *c[] {ENTER,NEW,POINT,FIRST};char**cp[] {c3,c2,c1,c};char***cpp cp;printf(%s\n, **cpp);printf(%s\n, *--*cpp3);printf(%s\n, *cpp[-2]3);printf(%s\n, cpp[-1][-1]1);return 0;
}同二二级指针cp内存放的是将*c内元素逆转过来的而三级指针指向的就是cp首元素所以**cpp就是指向的cpp向后走一个元素即c2即“POINT”*--*cpp3就是cpp 指向 cp 数组的下一个元素*--*cpp 得到一个指向 c[0] 的指针 ENTER然后 3 得到 ER *cpp[-2]3 中 cpp[-2] 得到 cp[0]*cpp[-2] 得到 c[3]然后 3 得到 STcpp[-1][-1]中cpp[-1] 即*(cpp-1)得到 cp[2]cpp[-1][-1] 即 *(*(cpp-1)-1) 得到 c[1]然后 1 得到 EW。答案就是POINT ER ST EW C语言指针也就到此为止了最后再次祝大家新年快乐愿大家成为自己心目中的那个人。插一嘴哈~虽然指针结束了但大伟的学习和博客还没有结束哦希望大家以后继续支持大伟加油
衣带渐宽终不悔为伊知识消得人憔悴 ------柳永 本篇博客也就到此为止了送大家一碗鸡汤勉励自己以及这世界上所有追逐梦想的赤子趁年华尚好努力提升自己莫欺少年穷