浅谈回调函数

浏览知乎看到有人问如何理解回调函数阅读了部分回答,结合维基百科的例子总结如下。

知乎上赞同数最多的回答者的答案是:

你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。回答完毕。

正常情况下比如简单的函数:int max(int a, int b);

要使用这函数,得到两者最大的值, 外面就要传进来 a, b。这个......

C语言位域

本文是阅读再谈C语言位域一文的读书笔记,结合K&&R C语言程序设计与维基百科中相关内容进行总结。

位段(或称“位域”,Bit field)为一种数据结构,可以把数据以位的形式紧凑的储存,并允许程序员对此结构的位进行操作。这种数据结构的好处:

可以使数据单元节省储存空间,当程序需要成千上万个数据单元时,这种方法就显得尤为重要。

位域可以很方便的访问一个整数值的部分内容从而可以简化程序源代码。

而位域这种数据结构的缺点在于,其内存分配与内存对齐的实现方式依赖于具体的机器和系统,在不同的平台可能有不同的结果,这导致了位域在本质上是不可移植的。

在C语言中,位域的声明和结构......

命令行参数解析

首先使用命令行解析函数getopt与getopt_long函数需要包含如下头文件:

#include <unistd.h>

extern char *optarg; //选项的参数指针

extern int optind, //下一次调用getopt的时,从optind存储的位置处重新开始检查选项。

extern int opterr, //当opterr=0时,getopt不向stderr输出错误信息。

extern int optopt; //当命令行选项字符不包括在optstring中或者选项缺少必要的参数时,该选项存储在optopt 中,getopt返回&#......

字节顺序

字节顺序,又称端序或尾序。在计算机科学领域中,是跨多字节的程序对象的存储规则。参考链接字节顺序 字节排序

在代码中如何判断各系统采用大端方式还是小端方式呢,除了上面链接我之前的判断外,另一种方法如下:

#include <stdio.h>

#include <string.h>

union u_tag

{

short s;

char c[sizeof(short)];

}un;

int main(int argc, const char * argv[])

{

un.s = 0x0102;

//打印数组c中地址关系

printf("%p %p\......

指针与数组

鉴于指针与数组的重要性,在阅读经典 C程序设计语言时将总结内容单独记录在该文中。

ANSI C使用void *(指向void的指针)代替char *作为通用指针的类型。

地址运算符&只能应用于内存中的对象,即变量与数组元素。它不能作用于表达式、常量或register类型的变量。

语句(*ip)++中的圆括号是必须的,如果不加括号,该表达式将对ip进行加一运算,而不是对ip指向的对象进行加一运算,原因是与*和++这样的一元运算符遵循从右至左的的结合顺序。

在函数定义中,形式参数char s[]和char *s是等价的。我们通常更习惯于使用后一种形式,因为它比前者更直观地表明了该参数......

C语言拾遗

本文的目的是记录平时工作学习过程中学习到的C语言知识,由于单独一篇文章记录的话可能篇幅过少,因此置顶此文用作此用处,本文从2017-12-16开始记录,后续新增内容不单独列出时间,在MarkEditor中有相应的版本记录。

文件描述符

EOF(end of file)文件结束,参考如下代码:

#include <stdio.h>

int main()

{

int c;

while((c = getchar())!=EOF)

{

printf("%c",c);

}

printf("\n");

printf("Last ti......

Mac下10大常用快捷键

本文记录Mac下10大常用快捷键,来源于10个你不知道的Mac键盘快捷方式小窍门

option + wifi图标

可以查看链接的wifi信息等,在网络出问题时可以方便打开无线诊断。

音量键

option + shifit+音量调节键(F11 F12)

更小粒度的音量调节

截屏

自定义区域:command+shift+4

全屏:command+shift+3

command+option+escape

command + space(空格键) 短按

切换输入法

command + space 长按

打开Sirl

六......

指针数组与数组指针

指针数组:array of pointers,即用于存储指针的数组,也就是数组元素都是指针

数组指针:a pointer to an array,即指向数组的指针

还要注意的是他们用法的区别,下面举例说明。

int* a[4] 指针数组

表示:数组a中的元素都为int型指针

元素表示:*a[i] *(a[i])是一样的,因为[]优先级高于*

int (*a)[4] 数组指针

表示:指向数组a的指针

元素表示:(*a)[i]

我们先看维基百科中对于数组指针的解释:

数组名出现在表达式中时,绝大多数情况(除了数组名作为sizeof的操作数或......

C函数指针基础

函数指针可以像一般函数一样,用于调用函数、传递参数。在如 C 这样的语言中,通过提供一个简单的选取、执行函数的方法,函数指针可以简化代码。

函数指针只能指向具有特定特征的函数。因而所有被同一指针运用的函数必须具有相同的参数和返回类型。

一个简单的例子:

#include <stdio.h>

// 函数原型

void sayHello();

//函数实现

void sayHello(){

printf("hello world\n");

}

// main函数调用

int main() {

sayHello();

return 0;

}

在上面......

分析C语言声明

在阅读Liunx/UNIX系统编程手册一书在阅读到第20章时遇到函数signal()的声明时完全不懂这个函数是什么意思,于是网上搜索,有几个帖子里面介绍的方法是《C专家编程》一书第三章中相关内容,本文就是为了弄懂函数signal()的声明。

在阅读了本章内容后,我尝试用自己的语言来解释函数signal()的声明,如果有幸有朋友看到,希望可以批评指正。

首先介绍signal()函数声明前先了解函数指针,参考C函数指针基础.

首先函数signal()的原型:

void (*signal(int sig, void (*handler)(int)))(int);

分析如下形式:

......