格式:类型名(*指针变量名)(参数类型,参数类型……)
定义实例:int (*pf) (int, char);
使用实例:pf = PrintMin; /* 此处切记,函数仅有名称,没有参数列表】*/
pf(x, y); /* 函数指针直接作为函数名使用 */
qsort(base【起始地址】, nelem【元素个数】, width【元素大小】, (*pfcompare)【比较函数指针】)
int cmp(const void* a, const void* b){} 返回值:
(1)负整数:a应该在b前面;(2)零:a,b位置不变;(3)正整数:a应该在b后面。
另注意:重写 cmp 函数时,需要强制类型转换 void* 类型,例如(int*)a - (int*)b,具体见http://blog.csdn.net/ironyoung/article/details/8057770
命令行参数:可执行文件名后面的字符串,例如 notepad sample.txt 中,sample.txt 就是命令行参数。
需要对命令行参数进行处理,那么 int main() 函数需要 int main(int argc【参数个数,包含可执行文件名,故至少为 1】, char*argv[]【存放参数,argv[0] 是可执行文件名】)
如果有命令行参数内部有空格,则使用双引号" "整个括起来输入,例如:sample para1 para2 s.txt 5 "hello world"
(1)~按位非:唯一的单目位运算符,例如:~21
(2)&按位与:清0操作,或者取出某一位。例如:判断 n 的第7位是1?n&=0x80
(3)| 按位或:清1操作
(4)^ 按位异或:某些位取反(^1),例如:低8位取反 n^0xff
特殊异或性质:因为a^b=c,则有c^a=b,c^b=a
特殊异或技巧:不允许使用临时变量,交换 a,b 两数的值。a = a^b,b=b^a,a=a^b
(5)a << b:左移位,高位丢弃,低位补 0。比乘法快上很多,与2的幂次方相乘
(6)a >> b:右移位,低位丢弃,高位补充与原正负符号位相同的位。结果并不与除法相同,是除以2的幂次方后结果往小取的整数。-1.xx => -2,1.xx => 1
例题:判断 a 的第 n(0<=n<=31) 位上0?1?答案:(a>>n)&1【注意:第31位上是符号位】
int& r = n; // r 的类型是 int&,r 是 n 的别名,本质上是同一个事物
引用必须在定义时初始化,只能引用一次(从一而终)
引用对象只能是变量,不能是表达式、不能是常量:int& a = 8; int& b = n*5;
使用实例:(1)int &r1 = a; int &r2 = r1; r1 = b; 此时 a, r1 , r2 都是同一个事物,变一个其他都改变。此时 r1 = b; 中 r1 仍是 a,此句仅是赋值(从一而终)
(2)交换参数值函数:void swap(int& a, int& b) { int tmp = a; a = b; b = tmp;}
(3)函数返回类型是引用:int n; int& set() {return n;} void main(){set() = 40;} 此处即 n 被赋值 40
常引用不能修改 r = 5 是非法赋值,但是可以修改常引用所引用的变量:const int& r = n; r 不能修改,但是 n 的值可以修改
少用 define,多用 const;可以用于函数的参数类型
不能通过常量指针修改指向的内容,但是可以通过常量指针指向的变量修改,可以修改常量指针的指向:const int* p = &n; *p = 5不行,但是 n=4 可以
不同于引用:常量指针可以修改常量指针的指向(引用中,修改指向视为赋值),p = &m 通过
常量指针 = 非常量指针 可以,非常量指针 = 常量指针 不可以,除非经过强制类型转换 int* q = (int*) p; 否则利用 q 修改 p
C:malloc,C++:new
T* p = new T; T* p = new T[n]; 这两个 p 都是指针,第一个 p 指向一个数,第二个 p 指向数组的第一个元素
delete p; // 对应第一个 p
delete[] p; // 对应第二个 p
delete 仅能删除 new 出的对象,不能删除数组
inline内联函数
重载:C++ 中才有,函数参数的个数、类型不同,即参数表不同
函数同名、参数表不同、返回类型相同 / 不同,是重载;函数同名、参数表相同、返回类型不同,是重复定义
void func(int a, int b = 2, int c = 3){},为了函数扩充性(省去每个函数的修改)
使用实例:func(10); func(10, 8);// 此时更改了第二个参数为8,第三个函数还是缺省值3,但是只能缺省最右边的参数
func(10, , 6); // 错误