运算符
n-->0 含义是 n-- > 0,因为C语言的每个符号应包含尽可能多的字符。比如a+++++b,含义为((a++)++) + b,但实际上符号”++”不允许a++作为左值,因此语义错误。
单目运算符是从右向左结合,比如*p++,含义为*(p++)
单目运算符优先于双目运算符
双目运算符:算术 > 移位 > 关系 > 逻辑 >赋值
特别地,关系运算符中 == != 优先级高于 < <= > >=,因此,有a < b == c < d这种形式。
逻辑运算符中,& > ^ > | > && > ||
比如:if (a & b != 0)错误,if ( (a & b) != 0)正确
r = high << 4 + low错误,r = (high << 4) + low正确
因此,正确的解决方法,还是加括号,但是,记住这些优先性还是有必要的。
函数指针,在库实现中得到参数结果传递给接口的方法
float *g(), (*h)();
g是一个函数,该函数的返回值为指向浮点数的指针。
h是一个函数指针,h所指向函数的返回值是浮点类型。
libpcap中的一个例子:
pcap.h中定义
typedef void (*pcap_handler)(u_char *, const struct pcap_pkthdr *, const u_char *);
int pcap_loop(pcap_t *, int, pcap_handler, u_char *);
pcap.c中定义
int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user) { }
主文件中
调用pcap_loop(_pcap_handle, -1, &pcap_packet_callback, NULL);
进行实现static void pcap_packet_callback(u_char * args, const struct pcap_pkthdr *header, const u_char * packet) { }
将pcap_packet_callback的地址传递给 函数指针类型pcap_handler的callback。而之所以我们可以直接在pcap_packet_callback中使用header和packet的原因是:在pcap_loop实现中通过pcap *p,进行操作后得出&h(即header)和p->buffer(即packet),然后用(*callback)(user, &n, p->buffer)将这些得到的参数传递给接口。
int (*a)[31]; a为指向数组的指针。int b[12][31],b同样可认为是指向数组的指针
a = &b[11];可认为是a指向了b[11]中31个元素中的第一个元素。
注意 strlen( ) 只返回字符串字符数量并不包括’\0’
例子:
char *r;
r = (char *)(strlen(s) + strlen(t) + 1)
if (!r) {
printf(“error”);
exit(1);
}
strcpy(r, s);
strcat(r, t);
free(r);
-----------------------------------------------------------------------
main(int argc, char *argv[])与main(int argc, char**argv)完全等效,只不过前面一种写法强调的重点在于argv是一个指向某数组的起始元素的指针,该数组的元素为字符指针类型。
返回整形的getchar()
更新文件顺序
假设malloc的执行过程被一个信号中断。此时,malloc函数用来跟踪可用内存的数据结构很可能只有部分被更新。如果signal处理函数再调用malloc函数,结果可能是malloc用到的数据结构完全崩溃,后果不堪设想。
宏,文本的变换,优缺点,编写遇到的问题