C语言学习笔记整理3

主要整理内容:

1、内存分配
2、关键字

内存分配:储存在四块区域
栈(stack)、堆(heap)、数据区(.data和.bas)、常量区(只读)

1、栈:局部变量、函数的形参,自动变量(auto修饰)
特点:
1、栈空间是OS(操作系统)自动分配和回收,程序员自己不用管
2、可以被反复使用
3、栈空间是脏的。------保存上一次使用的结果==>定义局部变量的时候一定要初始化
4、临时性,不能返回栈变量的指针!

2、堆空间:;malloc,ralloc,calloc
特点:
1、灵活:程序员自己手动分配,手动释放
2、内存量大
3、通过free()手动释放所申请的内存空间。如果你忘了释放堆空间的内存,这块空间一直被占用着!
系统会觉得你一直在使用就不会把这块内存分配给其他的程序。==>内存泄露
4、临时性:malloc和free之间,这块内存是归你使用的。
5、堆空间也是脏的。==》使用之前需要清空一下

3.内存中的各个段
.text段:代码段,保存的程序中各个函数的指令。
.data段数据段:保存的全部变量,显示初始化为非0静态变量(static修饰的,例1:static int num = 12;)
.bss段:保存的是显示初始化为0,或者是没有初始化的静态变量

关键字:
1-const:修饰变量,希望将这个变成“常量”
用法:
(1)修饰普通变量:
const无论是放在数据类型的前面或是后面,都是将变量修饰为常量,不能改变变量的值。

(2)和指针变量结合起来使用
如果想知道const是修饰谁的,从const开始往右看!
看你先遇到谁,如果是先遇到*p,那就是*p不能被改变。
如果先遇到P,就是p不能被改变
例2:
int a = 1;
int const *p = &a;  //*p不能被改变
通过指针变量不能间接改变a的值,但是可以通过变量本身来改变。
上例2所示语句条件下:
a = 12;  //对
*p = 11; //报错

2-static:静态变量
作用:
1、修饰局部变量:延长局部变量的生命周期。
2、如果修饰全局变量,函数;具有“隐藏”的功能,保证函数和全局变量只能够在本文中使用(.c)
不能够在其他的文件中使用,也就是不能够在其他的.c文件中使用

3-volatile:防止编译器优化处理
volatile int temp = 10;
提醒编译器,volatile后面修饰的变量随时可能改变!要求编译器将编译后的程序每次读取变量数的
时候,直接从变量的地址里面去读取,而不是去寄存器里面去读取==》寄存器里面的数值和地址里的数值不一样。

4-register:
有register修饰的变量,是寄存器变量!告诉编译器,register修饰的变量会经常调用,请求编译器尽可能地把
register修饰的变量保存到CPU内部的寄存器上。而不是通过内存取地址来调用==》以此来提高效率

注意点:
1、对变量的操作,因为可能不是保存到内存里面,所有就不能用&来对变量进行操作
2、变量的类型能够被CPU所接受!register修饰的变量(<= int型的),但是有些机器也可以是浮点型。
3、不能修饰全局变量,函数!可以修饰局部变量。

5-extern:外部声明
1、函数定义的时候,在前面加上extern表明这个函数是外部函数,可以在其他的文件中调用!如果不加,默认是外部函数,可以在其他文件中调用。
(这条是extern和static之间的区别)
2、在调用的地方extern进行外部声明,表明这个函数在别的文件中定义了,如果不用extern的话,会有警告。

小端存储:
低字节放低地址,高字节放高地址

大端储存:
低字节放高地址,高字节放低地址

怎么测试系统是大端还是小端储存方法:
1、采用共用体的方式
2、指针的方式

猜你喜欢

转载自blog.csdn.net/CSDN_JKing/article/details/81209342