1. 函数调用,参数列表从右往左入栈。而语句从左到右执行
#include <string.h>
int p1(){
printf("1");
return 1;
}
int p2(){
printf("2");
return 2;
}
int p3(){
printf("3");
return 3;
}
int sum(int a,int b,int c){
return a+b+c;
}
int main(){
int var = 1;
printf("%d ",sum(p1(),p2(),p3()));
printf("%d\n",p1()+p2()+p3());
return 0;
}
执行结果:3216 1236
2. 大端/小端字节序
-
大端(Most significant bit)字节序符合人的习惯,高位字节放在变量起始地址,也作为网络通信中的字节序如
unsigned int var = 0x12345678
,地址 0x05 0x06 0x07 0x08
var 0x12 0x34 0x56 0x78 -
小端(Least significant bit)字节序则更为直观,低位字节放在变量起始地址,上述的var变量的内存分布为
地址 0x05 0x06 0x07 0x08
var 0x78 0x56 0x34 0x12
3. restrict关键字
修饰指针,用于告知编译器,所有对于指针所指的变量的修改都是通过该指针进行的
注意,这个关键字只用于告知编译器这个假设,编译器并不会对这个假设进行检验,也就是说如果你将这个指针复制了几遍,也不会报错,可以使用C99中的memcpy函数进行检验
4. 类型转化cast
1. const_cast
2. static_cast
3. dynamic_cast
4. reinpreter_cast
5. strcmp与空字符串比较会崩溃,如果某字符串A是另一字符串B的前缀,则A<B
6. extern "C"
7. 动态链接库与静态链接库
8. 常量字符串与变量字符串
char *c = "hello world";//常量字符串,即使在函数内部定义也存放在全局的常量区
c[0] = 'a';//错误,常量不可修改
char c[] = "hello world";//局部变量,在函数内部定义存在在栈中
c[0] = 'a';
9. 取数组名的地址结果是二维数组
int pt[]={0,1,2,3,4,5};
int *pt2 = (int *)(&pt + 1);
printf("%d",*(pt2-1));
10. 浅拷贝,默认拷贝函数对于指针成员变量进行的是浅拷贝,容易造成对同一块内存的多次析构
11. 必须用初始化列表进行构造的成员变量有
1.const成员
2.引用成员
3.基类构造函数
12. 虚析构函数
13. 类成员初始化顺序
c++ 中类变量的初始化顺序,大体如下:
基类的静态成员初始化;
派生类的静态成员初始化;
基类的对象成员初始化;
基类的构造函数;
派生类的对象成员初始化;
派生类的构造函数;
14. inline放在定义之前
15. 运算符重载的两种方式:成员函数和友元,不改变优先级,结合性,参数个数
16. 虚函数表的内存布局
17. 程序的内存布局
18. int的边界值,unsigned边界值,补码
19. 宏定义与inline的区别
20. 虚构造/析构函数
21. 线程安全的函数如何设计
22. 补码表示
模表示可以表示的数的范围,如int的模式2^31
负数的补码表示 = 模 - 绝对值