A .基本类型要点:
1. 结构体:c++在处理结构体时,是按照一般的变量进行处理的。结构体可以作为函数参数和返回值。作为函数参数时,也分传值和传引用的区别,而作为返回值时,返回的是结构体的一个拷贝。可以将一个结构赋给另外一个结构。
2. 枚举: 枚举量是整型,可以被提升为Int类型,但是int不能自动转换为枚举类型; 还有没有为枚举定义操作符+; 如果Int值是有效的,可以通过强制类型转换,把它赋给枚举变量; 显示设置枚举值时,指定的值必须是整数; 枚举的取值范围为大于最大值得、最小的2的幂-1。例如enum bigstep{one=1,two=2,third=100}; 则bigstep的取值范围为0~127。
3. int *p1,p2;将创建一个指针和一个常规的int变量。
4. c++在创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。
5. 如果要将数字值作为地址来使用,应通过强制类型转换将数字转换为适当的地址类型。
6. c++中,值为0的指针为空指针。确保空指针不会指向有效的数据。
7. 不要尝试释放已经释放的内存块,但是对空指针使用delete是安全的。所以尽量不要创建2个指向同一个内存块的指针。
8. 不能使用sizeof操作符来确定动态分配的数组包含的字节数!!!、
9. 数组和指针的区别:1.数组名是指针,可以对指针进行+(-)操作,但是数组名不可以; 2.对数组应用sizeof得到的是数组的长度,而对指针应用得到的是指针的长度。
10. 如果给cout提供一个指针,它将打印地址。但如果指针的类型为char *,则cout将显示指向的字符串。如果要显示字符串的地址,则必须将这种指针强制转换为另外一种指针类型,如Int *。
B .循环和关系表达式:
1. 递增和递减操作符在同一个值中使用多次时,因为每个编译器很可能对于“使用后修改”和“修改后使用”的规则可能不同,因此可能导致在不同的编译器下得到不同的结果。
2. c++规定,在使用递增或者递减时,确定一个完整表达式(它是这样一个表达式,不是另一个更大表达式的子表达式),每个完整表达式完了,在下一个开始之前,都要评估一次。例如:while(guest++<10) printf("%d",guest); 其中的guest++<10是一个完整表达式,一次在第一次printf的之前,要评估一次,这样打出来的guest已经加一; 再如,y=(4+x++)+(6+x++);,显然整个句子才是一个完整表达式,c++只保证在执行下一条语句之前,x+2,但是没有规定是在计算每个子表示式之后将x递增还是在整个表达式计算完毕之后才将x的值递增!这个时候跟编译器有关,所以尽量避免使用这样的句子。
3. *和++同时作用于指针时,取决于优先级。前缀指针和*的优先级同,从右到左结合。后缀比*(还有前缀)优先级高。
4. c++为类型建立别名的方式有两种:1.预处理器 #define BYTE char 2.使用typedef typedef char BYTE; 最好使用typedef.
C .分支语句和逻辑操作符:
- switch(integer-expression){} 中的判断表达式必须为一个结果为整数的表达式。因此switch不能处理浮点测试。都是整数时,如果选项超过2个,switch的效率比if else高。
D .函数
1. 在c++中,void test();与void test(void)是等效的,意味着函数没有参数。argument--实参 parameter--形参
2. 在c++中,当且仅当用于函数参数时,int *arr和int arr[]的含义是相同的,它们都意味着arr是一个int指针。
3. int age=39; const int *p=&age; 后边的声明表示p指向一个const int(这里为39),因此不能使用pt来修改这个值。即*p=31;这个语句是不合法的。我们能通过修改age=23;来改变age的值,但是这个时候*p仍然为39!!也就是const int *p一旦指定一个值后,*p的内容将不改变,即不能通过*p改变值。
4. 将const的地址赋给常规指针是不可行的。后边再详细讨论下const+指针的情况。
5. 获取函数的地址很简单:只要使用函数名即可,不跟参数。声明函数指针时应该指定函数的返回类型及函数的参数列表。例如一个函数的原型为 double pam(int); 则其对应的函数指针的声明为:double (*pPam)(int); pPam就是函数pam的函数指针。则我们现在可以赋值 pf=pPam; 然后就可以使用这个函数指针来调用函数了。例如:double r=(*pPam)(5);或者double r=pPam(5);