一般采用多文件编程
.h文件与.cpp文件分开
.h - 头文件,主要存放结构体的定义,函数的声明等等
语句一般使用在函数中,
具体操作实现
结构体变量名.成员名
“.”是“成员运算符”(分量运算符)。
::是运算符中等级最高的,它分为三种:全局作用域符,类作用域符,命名空间作用域符。他们都是左关联(left-associativity)。他们的作用都是为了更明确的调用自己的对象或者函数。
运算符:
逗号运算符是指在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。
关键字
缺省,即系统默认状态,意思与“默认”相同。
auto:缺省状态下默认所有变量都是auto
register:寄存器变量,尽可能的将变量存放在寄存器中,所以不能通过取’&’来获取变量地址。
Const:生命只读变量(修饰原则是距离谁近修饰谁)。
Extern:进行外部链接指令。全局变量或函数在缺省情况下的链接属性是extern,告诉编译器变量或者函数是在别的文件中定义的。
如果一个全局变量与一个局部变量名字相同,则在局部变量所咋的代码块内优先使用巨变变量,但是如果给这个局部变量加上extern,则使用全局变量。
Static:当作用于所有代码块之外时,可用于改变函数或全局变量的链接属性,使其只能进行内部链接,在本文件中可用。
当作用于代码块之内的变量声明时,1.改变其存储类型,使其存储到静态区(bss)。2.改变生命周期,使其一直存活到程序结束。3.不改变作用域。4.如果变量没有初始化,则默认初始化为0。
Typedef:给数据类型取别名,还有其他用处
Volatile:告诉编译器到内存中取值,保证内存可见性。
一般运行规则:
1. 隐式类型转换(整型提升)字符或短整形在使用前先被转换成普通整形。
2. 算数转换:如果某个操作符的两个操作数属于不同类型,则精度低的向精度高的转换,再进行操作。
3. 宏名与参数之间不能有间隔。
4. 想要在变量所声明的代码块外部改变变量则应进行“传址”。
5. int *p=后面必须是地址变量! 区别很大。
第一个int *p = a;这是把a给一个指针,一般a是指针或数组,否则可能会造成很大错误。
6. int *p = &a;这是把a的地址给p,一般a可以是一个整型变量。
7. int *p[3]和int (*p)[3] 的区别
这两个其实是数组指针和指针数组的区别。我们一个一个来说明:
int *p[3];//定义了一个三维数组,其中的每个元素p[0]、p[1]、p[2]都是指向int变量的指针。
int (*p)[3];//定义了一个指针,这个指针是指向一个三维数组的。
两者之间的区别和联系可以用一个二维数组来阐述:
int *p[3];//定义p[3]为指针数组
int (*q)[3];//定义q为数组指针
int a[4][3];//定义一个二维数组
p[0]=&a[0][0];//可以取a[4][3]中任意元素的地址给p[3]中的元素赋值
q=a[1];//a[1]其实是一个三维数组,其元素包括a[1][0],a[1][1],a[1][2],所以
//a[1]就表示这个数组的首地址,这个地址可以用来给q赋值
8. 0.
函数结构
声明:好的习惯是将函数声明(原型)放到一个单独的文件,便于维护和使用
定义:函数定义就是函数体的实现,函数体就是一个代码块。它在函数被调用时执行。
函数定义语法:类型 函数名(形参){函数体}
参数:参数传递:传值和传址,想要在变量所声明的代码块外部改变变量则应进行“传址”。
可变参数列表:可变参数列表是通过宏实现的,这些宏定义在stdarg.h头文件中。
Main函数
递归:递归函数就是直接或者间接的调用资深的函数。递归必须要有递归终止条件,还要有逼近递归终止条件的条件。当递归越深,效率越低。尾递归可用循环替代。
编译链接:1.预编译;2.编译;3.汇编;4.链接
函数的调用过程—栈帧
函数的定义
函数的定义是一个完整的函数单元:
1. 包含函数类型、函数名、形参及形参类型、函数体等
2. 在程序中,函数的定义只能有一次
函数的声明
函数声明只是对编译系统的一个说明:
1. 函数声明是对定义的函数的返回值的类型说明,以通知系统在本函数中所调用的函数是什么类型。
2. 不包含函数体(或形参)
3. 调用几次该函数就应在各个主调函数中做相应声明
4. 函数声明是一个说明语句,必须以分号结束!
int add(int x,int y); //函数声明语句
int add(int x,int y)//函数定义
{ int z; z=x+y; return z; }
难懂的代码
int *Pi = const_cast<int*>(&i);
使用const_cast可以返回一个指向非常量的指针(或引用)指向b1,就可以通过该指针(或引用)对它的数据成员任意改变。