为形参,如void f(int **pp),作用是对作为指针的实参传址,如f(&p);
函数名是地址常量,可赋值给对应的指针变量----函数指针
函数指针赋值: pfun = 函数名: 把函数名看做函数的入口地址
pfun = &函数名: 把函数看做名字,取其地址
调用: (*pfun)(实参列表)
pfun(实参列表)
void myfun(int x) {printf(“%d”,x);}
void main {
void (*pfun)();
pfun = myfun;
myfun(10); //四种调用方式都是ok的
(*myfun)(10);
pfun(10);
(*pfun)(10);
}
22. (1).不要在函数调用处(参数列表中)写表达式;
(2).后++,求值时间要后到整个表达式求完值后,参数中的后++到形实结合后++;
(3).函数调用结果只能用于初始化非静态变量,static char *p = (char *)malloc(20)---->错误;
(4).static不作用与形参,会失去静态性;
(5).避免函数有记忆功能(不要使用static局部变量);函数中少修改static全局变量,避免影响其他函数;
(6).函数默认有extern修饰,函数和全局变量可以用static修饰限定为本文件使用;
(7).两层循环,多的应该放里面,减少循环次数。
23. 预处理
(1).预处理语句以#开头,不加”;”,独占一行,可放于任意位置;
(2).预处理在编译之前,条件编译、宏、条件包含;
(3).预处理之前还有预处理:消除续行,检查函数名,去掉注释;
(4).宏定义不是C语句,不是函数,不是类型定义,宏值多于一项一定要加(),防止优先级错误;
(5).宏中的’#’使变量字符串化;
(6).宏中的’##’使变量连接起来,#define TEST(a,b) a##b TEST(2,3); --->23;
(7).宏的参数不能用表达式;
(8).用const取代无参宏,用inline取代有参宏;
(9). (void)printf(“Beijing.\n”); void显式抛弃返回值.
24. 头文件
(1).头文件包含会引发重复定义变量,可以用条件编译解决:
#ifndef _FILENAME_H_
#define _FILENAME_H_
#endif
(2).头文件中不要定义较大的static全局变量,如结构数组等;