1. C中可变参数函数作为函数参数:

  1. void media_debug_set_handler(struct media_device *media, void (*debug_handler)(void *, ...), void *debug_priv)
  2. 调用:
  3. media_debug_set_handler(media, (void (*)(void *, ...))fprintf, stdout);

2.可变参数函数

  1. gstcaps.c
  2.  
  3. GstCaps *gst_caps_new_full (GstStructure * struct1, ...)
  4. {
  5. GstCaps *caps;
  6. va_list var_args;
  7.  
  8. va_start (var_args, struct1);
  9. caps = gst_caps_new_full_valist (struct1, var_args);
  10. va_end (var_args);
  11.  
  12. return caps;
  13. }
  14.  
  15. GstCaps * gst_caps_new_full_valist (GstStructure * structure, va_list var_args)
  16. {
  17. GstCaps *caps;
  18.  
  19. caps = gst_caps_new_empty ();
  20.  
  21. while (structure) {
  22. gst_caps_append_structure_unchecked (caps, structure);
  23. structure = va_arg (var_args, GstStructure *);
  24. }
  25.  
  26. return caps;
  27. }

3.offsetof实现

#include <stddef.h>中  #define offsetof(TYPE, MEMBER) ((int)&((TYPE *)0)->MEMBER)

疑问:为什么自己同样实现报将指针强制类型转换为int,使用头文件中的怎么没有呢 ?

4.C的精髓

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void getArray(long *p) {
  5. int i, j, n = ;
  6. int *p1 = malloc();
  7.  
  8. for (i = ; i < ; i++) {
  9. for (j = ; j < ; j++) {
  10. p1[n++] = n;
  11. }
  12. }
  13.  
  14. *p = (long)p1;
  15. }
  16.  
  17. void printArray(void **p) {
  18. int i, j;
  19. int (*p1)[] = (int (*)[])p;
  20. //int **p1 = (int **)p; //oops,for different deference protocoal
  21.  
  22. for (i = ; i < ; i++) {
  23. for (j = ; j < ; j++) {
  24. printf("[%d %d]", p1[i][j], *(*(p1+i)+j)); //array pointer also can use ** to deference
  25. }
  26. printf("\n");
  27. }
  28. }
  29.  
  30. int main() {
  31. int **p = NULL;
  32.  
  33. getArray((long *)&p); //三级指针可以强制转换成一级指针进行传参,印证只有值传递
  34.  
  35. printArray((void **)p);
  36.  
  37. free((void *)p);
  38.  
  39. return ;
  40. }

5.GNU扩展

  1. int main() {
  2. int i;
  3. char a[] = {[ ... ] = };
  4.  
  5. for (i = ; i < ; i++) {
  6. printf("a[%d] = %d\n", i, a[i]);
  7. }
  8.  
  9. return ;
  10. }

6.errno

errno 是记录系统的最后一次错误代码,错误代码定义在Linux内核的errno-base.h中。errno是一个int型的值,在errno.h中定义。
当linux C api函数发生异常时, 一般会将errno变量(需include errno.h)赋一个整数值, 不同的值表示不同的含义,可以通过查看该
值推测出错的原因。

注意errno记录的是最后一次出错的错误代码,感兴趣的错误代码可能被最新的错误覆盖!

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <errno.h>
  7.  
  8. void main()
  9. {
  10. printf("errno = %d\n", errno); // errno=0
  11. // chmod 444 tmp.txt
  12. int fd = open("tmp.txt", O_RDWR); //此时errno=13: Permission denied
  13. if (fd < ) {
  14. // no log.txt
  15. fd = open("log.txt", O_RDWR);
  16. printf("error: %s\n", strerror(errno)); //由于log.txt不存在,此处报的是No such file or directory
  17. }
  18. }

7. C中左右两边都可以的强制类型转换

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void* get_mem(){
  5. return malloc();
  6. }
  7.  
  8. void main()
  9. {
  10. float *p1;
  11. int *p2, *p3;
  12. p1 = (float*)get_mem();
  13. printf("p1=%p\n", p1);
  14. p3 = (int*)p1; //在右边进行强制类型转换
  15. *(float**)&p2 = p1; //在左边进行强制类型转换
  16. printf("p2=%p\n", p2);
  17. printf("p3=%p\n", p3);
  18. printf("Hello World\n");
  19. free(p1);
  20. }

&p2是一个常量,(float**)指定为地址,解引用为向此常量地址存储空间中写入值,此地址刚好就是p2指针的存储空间。

C经典案例的更多相关文章

  1. javascript的理解及经典案例

    js的简介: JavaScript是一种能让你的网页更加生动活泼的程式语言,也是目前网页中设计中最容易学又最方便的语言. 你可以利用JavaScript轻易的做出亲切的欢迎讯息.漂亮的数字钟.有广告效 ...

  2. jQuery基础的工厂函数以及定时器的经典案例

    1. jQuery的基本信息:  1.1 定义: jQuery是JavaScript的程序库之一,它是JavaScript对象和实用函数的封装, 1.2 作用: 许多使用JavaScript能实现的交 ...

  3. Linux运维之道(大量经典案例、问题分析,运维案头书,红帽推荐)

    Linux运维之道(大量经典案例.问题分析,运维案头书,红帽推荐) 丁明一 编   ISBN 978-7-121-21877-4 2014年1月出版 定价:69.00元 448页 16开 编辑推荐 1 ...

  4. 经典案例:那些让人赞不绝口的创新 HTML5 网站

    在过去的10年里,网页设计师使用 Flash.JavaScript 或其他复杂的软件和技术来创建网站.但现在你可以前所未有的快速.轻松地设计或创造互动的.有趣好看的网站.如何创建?答案是 HTML5 ...

  5. Altera OpenCL用于计算机领域的13个经典案例(转)

    英文出自:Streamcomputing 转自:http://www.csdn.net/article/2013-10-29/2817319-the-application-areas-opencl- ...

  6. php中foreach()函数与Array数组经典案例讲解

    //php中foreach()函数与Array数组经典案例讲解 function getVal($v) { return $v; //可以加任意检查代码,列入要求$v必须是数字,或过滤非法字符串等.} ...

  7. 阿里云资深DBA专家罗龙九:云数据库十大经典案例分析【转载】

    阿里云资深DBA专家罗龙九:云数据库十大经典案例分析 2016-07-21 06:33 本文已获阿里云授权发布,转载具体要求见文末 摘要:本文根据阿里云资深DBA专家罗龙九在首届阿里巴巴在线峰会的&l ...

  8. 经典案例之MouseJack

    引言:在昨天的文章<无线键鼠监听与劫持>中,我们提到今天会向您介绍一个无线键鼠的监听与劫持的经典案例,<MouseJack>:MouseJack能利用无线鼠标和键盘存在的一些问 ...

  9. HTML5 CSS3 经典案例:无插件拖拽上传图片 (支持预览与批量) (二)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/31513065 上一篇已经实现了这个项目的整体的HTML和CSS: HTML5 C ...

  10. Wolsey“强整数规划模型”经典案例之一单源固定费用网络流问题

    Wolsey“强整数规划模型”经典案例之一单源固定费用网络流问题 阅读本文可以理解什么是“强”整数规划模型. 单源固定费用网络流问题见文献[1]第13.4.1节(p229-231),是"强整 ...

随机推荐

  1. Python的url解析库--urlparse

    一.urlparse解析url的query并构建字典 下面的方法主要的功能: 解析url的各个部分,并能够获取url的query部分,并把query部分构建成dict. 具体的代码实现: >&g ...

  2. mac外接显示器 双屏同时滑动问题

    问题:mac pro 外接一个显示器,用四个手指横向切换屏幕的时候,外接的显示器也一起跟着动了   解决:      

  3. 4-1 contag_tag:返回HTMLtag.

    jquery已经过时,做一遍,了解其他知识点. contag_tag(name, content_or_options_with_block = nil, options = nil, &bl ...

  4. Confluence 6 连接到一个 LDAP 目录

    https://www.cwiki.us/display/CONFLUENCEWIKI/Connecting+to+an+LDAP+Directory

  5. bzoj1834: [ZJOI2010]network 网络扩容 费用流

    bzoj1834 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小扩容 ...

  6. git 下载代码

    git clone https://github.com/ContextLogic/Wish-Merchant-API.git wish(wish是下载的地址,这样的话,就在你的住文件夹上)

  7. TCP文件发送

    发送端(客户端) #include <iostream> #include <winsock2.h> #include <Ws2tcpip.h> #include ...

  8. WEBSERVICE-AXIS2服务端代码

    下载axis2的插件 axis2-eclipse-codegen-plugin-1.7.1.zip axis2-eclipse-service-plugin-1.7.1.zip 解压后,将plugin ...

  9. ZOJ 3829 Known Notation 贪心 难度:0

    Known Notation Time Limit: 2 Seconds      Memory Limit: 65536 KB Do you know reverse Polish notation ...

  10. iOS工程中如何去掉第三方的警告

    一)第一种方法 在工程中有警告的地方,右键选择Review in log,然后就能看到类似[Wnonnull]这样的警告, 然后在工程buildSettings中的Other Warning Flag ...