0. static修饰变量和函数
static修饰变量,1)限定作用域,本文件内。全局变量(自定义起,本文件前面要用需extern声明),局部变量函数内;2)生命周期,程序运行期间一直保存。
static修饰函数,限定作用域,本文件内。
1. enum类型变量大小为4(sizeof),不论enum成员数量。
2. enum成员间用“,”分割,最后一个成员后可不加分隔号。
而struct、union成员间用“;”分割,最后一个成员后要加分隔号。而struct的成员初始化用“,”分割,最后成员后加不加“,”均可。
3. Stu_pst为typedef的struct student的类型,const Stu_pst stu3和Stu_pst const stu4完全等价。数据类型可忽略。
4. {}用用就是打包。
5. const修饰的只读变量不能用来作为定义数组的维数,也不能放在case关键字后面。
6. p为typedef的struct student类型,p+0x1为&p + sizeof(struct student)*1.
7. c语言中,所有非数组形式的数据实参均以传值形式调用。(对实参做一份拷贝并传递给被调用的函数,函数不能修改作为实参的实际变量的值,而只能修改传递给它的那份拷贝)
C语言中,当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。
8. 内存可分为三个区:静态区、栈、堆
静态区:保存自动全局变量和static变量(包括static全局和局部变量)。静态区的内容在整个程序的生命周期内都存在,由编译器在编译的时候分配。
栈:保存局部变量。栈上的内容只在函数范围内存在,当函数运行结束时,这些内容也会自动被销毁。其特点就是效率高,但空间大小有限。
堆:由malloc系列函数或new操作符分配的内存。其生命周期由free或delete决定。在没有释放之前一直存在,直到程序结束。其特点是使用灵活,空间比较大,但容易出错。
9. 指针一定要初始化为NULL,这样才能用if(NULL != p)来判断。
static作用进一步说明:
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。
(1)先来介绍它的第一条也是最重要的一条:隐藏。
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性
(2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。
(3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。如果把字符串定义成静态的,就省去 了这个麻烦,因为那里本来就是’\0’。