Coursera 程序设计实习 / Practice on Programming 笔记(第一周)

001-函数指针

格式:类型名(*指针变量名)(参数类型,参数类型……)

定义实例: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

002-命令行参数

命令行参数:可执行文件名后面的字符串,例如 notepad sample.txt 中,sample.txt 就是命令行参数。

需要对命令行参数进行处理,那么 int main() 函数需要 int main(int argc【参数个数,包含可执行文件名,故至少为 1】, char*argv[]【存放参数,argv[0] 是可执行文件名】)

如果有命令行参数内部有空格,则使用双引号" "整个括起来输入,例如:sample para1 para2 s.txt 5 "hello world"

003-位运算

(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位上是符号位】

004-引用

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 的值可以修改

005-const关键字和常量

少用 define,多用 const;可以用于函数的参数类型

不能通过常量指针修改指向的内容,但是可以通过常量指针指向的变量修改,可以修改常量指针的指向:const int* p = &n; *p = 5不行,但是 n=4 可以

不同于引用:常量指针可以修改常量指针的指向(引用中,修改指向视为赋值),p = &m 通过

常量指针 = 非常量指针 可以,非常量指针 = 常量指针 不可以,除非经过强制类型转换 int* q = (int*) p; 否则利用 q 修改 p

006-动态内存分配

C:malloc,C++:new

T* p = new T; T* p = new T[n]; 这两个 p 都是指针,第一个 p 指向一个数,第二个 p 指向数组的第一个元素

delete p; // 对应第一个 p

delete[] p; // 对应第二个 p

delete 仅能删除 new 出的对象,不能删除数组

007-内联函数和重载函数

inline内联函数

重载:C++ 中才有,函数参数的个数、类型不同,即参数表不同

函数同名、参数表不同、返回类型相同 / 不同,是重载;函数同名、参数表相同、返回类型不同,是重复定义

008-函数缺省参数

void func(int a, int b = 2, int c = 3){},为了函数扩充性(省去每个函数的修改)

使用实例:func(10); func(10, 8);// 此时更改了第二个参数为8,第三个函数还是缺省值3,但是只能缺省最右边的参数

func(10,  , 6); // 错误

你可能感兴趣的:(C++,程序设计,Coursera,北京大学)