C经典案例
1. C中可变参数函数作为函数参数:
void media_debug_set_handler(struct media_device *media, void (*debug_handler)(void *, ...), void *debug_priv)
调用:
media_debug_set_handler(media, (void (*)(void *, ...))fprintf, stdout);
2.可变参数函数
gstcaps.c GstCaps *gst_caps_new_full (GstStructure * struct1, ...)
{
GstCaps *caps;
va_list var_args; va_start (var_args, struct1);
caps = gst_caps_new_full_valist (struct1, var_args);
va_end (var_args); return caps;
} GstCaps * gst_caps_new_full_valist (GstStructure * structure, va_list var_args)
{
GstCaps *caps; caps = gst_caps_new_empty (); while (structure) {
gst_caps_append_structure_unchecked (caps, structure);
structure = va_arg (var_args, GstStructure *);
} return caps;
}
3.offsetof实现
#include <stddef.h>中 #define offsetof(TYPE, MEMBER) ((int)&((TYPE *)0)->MEMBER)
疑问:为什么自己同样实现报将指针强制类型转换为int,使用头文件中的怎么没有呢 ?
4.C的精髓
#include <stdio.h>
#include <stdlib.h> void getArray(long *p) {
int i, j, n = ;
int *p1 = malloc(); for (i = ; i < ; i++) {
for (j = ; j < ; j++) {
p1[n++] = n;
}
} *p = (long)p1;
} void printArray(void **p) {
int i, j;
int (*p1)[] = (int (*)[])p;
//int **p1 = (int **)p; //oops,for different deference protocoal for (i = ; i < ; i++) {
for (j = ; j < ; j++) {
printf("[%d %d]", p1[i][j], *(*(p1+i)+j)); //array pointer also can use ** to deference
}
printf("\n");
}
} int main() {
int **p = NULL; getArray((long *)&p); //三级指针可以强制转换成一级指针进行传参,印证只有值传递 printArray((void **)p); free((void *)p); return ;
}
5.GNU扩展
int main() {
int i;
char a[] = {[ ... ] = };
for (i = ; i < ; i++) {
printf("a[%d] = %d\n", i, a[i]);
}
return ;
}
6.errno
errno 是记录系统的最后一次错误代码,错误代码定义在Linux内核的errno-base.h中。errno是一个int型的值,在errno.h中定义。
当linux C api函数发生异常时, 一般会将errno变量(需include errno.h)赋一个整数值, 不同的值表示不同的含义,可以通过查看该
值推测出错的原因。
注意errno记录的是最后一次出错的错误代码,感兴趣的错误代码可能被最新的错误覆盖!
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <errno.h> void main()
{
printf("errno = %d\n", errno); // errno=0
// chmod 444 tmp.txt
int fd = open("tmp.txt", O_RDWR); //此时errno=13: Permission denied
if (fd < ) {
// no log.txt
fd = open("log.txt", O_RDWR);
printf("error: %s\n", strerror(errno)); //由于log.txt不存在,此处报的是No such file or directory
}
}
7. C中左右两边都可以的强制类型转换
#include <stdio.h>
#include <stdlib.h> void* get_mem(){
return malloc();
} void main()
{
float *p1;
int *p2, *p3;
p1 = (float*)get_mem();
printf("p1=%p\n", p1);
p3 = (int*)p1; //在右边进行强制类型转换
*(float**)&p2 = p1; //在左边进行强制类型转换
printf("p2=%p\n", p2);
printf("p3=%p\n", p3);
printf("Hello World\n");
free(p1);
}
&p2是一个常量,(float**)指定为地址,解引用为向此常量地址存储空间中写入值,此地址刚好就是p2指针的存储空间。
C经典案例的更多相关文章
- javascript的理解及经典案例
js的简介: JavaScript是一种能让你的网页更加生动活泼的程式语言,也是目前网页中设计中最容易学又最方便的语言. 你可以利用JavaScript轻易的做出亲切的欢迎讯息.漂亮的数字钟.有广告效 ...
- jQuery基础的工厂函数以及定时器的经典案例
1. jQuery的基本信息: 1.1 定义: jQuery是JavaScript的程序库之一,它是JavaScript对象和实用函数的封装, 1.2 作用: 许多使用JavaScript能实现的交 ...
- Linux运维之道(大量经典案例、问题分析,运维案头书,红帽推荐)
Linux运维之道(大量经典案例.问题分析,运维案头书,红帽推荐) 丁明一 编 ISBN 978-7-121-21877-4 2014年1月出版 定价:69.00元 448页 16开 编辑推荐 1 ...
- 经典案例:那些让人赞不绝口的创新 HTML5 网站
在过去的10年里,网页设计师使用 Flash.JavaScript 或其他复杂的软件和技术来创建网站.但现在你可以前所未有的快速.轻松地设计或创造互动的.有趣好看的网站.如何创建?答案是 HTML5 ...
- Altera OpenCL用于计算机领域的13个经典案例(转)
英文出自:Streamcomputing 转自:http://www.csdn.net/article/2013-10-29/2817319-the-application-areas-opencl- ...
- php中foreach()函数与Array数组经典案例讲解
//php中foreach()函数与Array数组经典案例讲解 function getVal($v) { return $v; //可以加任意检查代码,列入要求$v必须是数字,或过滤非法字符串等.} ...
- 阿里云资深DBA专家罗龙九:云数据库十大经典案例分析【转载】
阿里云资深DBA专家罗龙九:云数据库十大经典案例分析 2016-07-21 06:33 本文已获阿里云授权发布,转载具体要求见文末 摘要:本文根据阿里云资深DBA专家罗龙九在首届阿里巴巴在线峰会的&l ...
- 经典案例之MouseJack
引言:在昨天的文章<无线键鼠监听与劫持>中,我们提到今天会向您介绍一个无线键鼠的监听与劫持的经典案例,<MouseJack>:MouseJack能利用无线鼠标和键盘存在的一些问 ...
- HTML5 CSS3 经典案例:无插件拖拽上传图片 (支持预览与批量) (二)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/31513065 上一篇已经实现了这个项目的整体的HTML和CSS: HTML5 C ...
- Wolsey“强整数规划模型”经典案例之一单源固定费用网络流问题
Wolsey“强整数规划模型”经典案例之一单源固定费用网络流问题 阅读本文可以理解什么是“强”整数规划模型. 单源固定费用网络流问题见文献[1]第13.4.1节(p229-231),是"强整 ...
随机推荐
- WPF使用Webbrowser操作网页的主要代码
1,引用mshtml.dll using mshtml; 2,获取元素属性值 IHTMLDocument2 doc2=(IHTMLDocument)webbrowser1.Document; IHTM ...
- PHP导出为Word格式
<?php $file = './html.doc'; $table = '<table width="100%"><tr><td>'.i ...
- windows下进程与线程剖析
进程与线程的解析 进程:一个正在运行的程序的实例,由两部分组成: 1.一个内核对象,操作系统用它来管理进程.内核对象也是系统保存进程统计信息的地方. 2.一个地址空间,其中包含所有可执行文件或DLL模 ...
- Intel DAAL AI加速——支持从数据预处理到模型预测,数据源必须使用DAAL的底层封装库
数据源加速见官方文档(必须使用DAAL自己的库): Data Management Numeric Tables Tensors Data Sources Data Dictionaries Data ...
- 转载:移动端+微信小程序实现,手机端滑动分页代码思路(ajax)
//一般在PC上我们要分页都是通过上一页和下一页来实现的,手机通过当下滑到一定程度的时候自动加载下一页面//实现思路:首先加载部分数据,当下滑到某个元素可见的时候,如果还有数据,则新发送请求,然后追加 ...
- Python的数据类型2列表
Python的数值类型List,也就是列表 Python的列表比较类似与其他语言的数组概念,但他又与其他语言数组的概念有很大的不同 C语言.Java的数组定义是这样的,存储多个同类型的数值的集合就叫数 ...
- springboot + swagger的实体类属性注解
@Api:用在类上,说明该类的作用 @ApiOperation:用在方法上,说明方法的作用 @ApiImplicitParams:用在方法上包含一组参数说明 @ApiImplicitParam:用在@ ...
- 快速切题 poj2632
Crashing Robots Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7799 Accepted: 3388 D ...
- 第n+1次考试
题目: 1. 中位数 [问题描述] 给定C个不同物品,每个物品有一重量和体积,保证每个物品的重量不一样.从中选出N个物品,在体积不超过F的情况下,使得选出的物品的重量的中位数最大.所谓中位数,就是排序 ...
- 用正则表达式输出rdf文档的三元组格式数据
占个位置 1.输出所有尖括号里的内容 package com.jena; import java.io.BufferedReader; import java.io.FileReader; impor ...