C语言进阶——01

C语言的应用非常广泛,无论是上位机还是嵌入式都需要应用到。并且由于C语言与硬件系统结合非常紧密,学好C语言可以对硬件系统如何与软件系统之间交互以及完成功能有更好的理解。
所以希望可以提高一下C语言的知识,而不是简单的了解一下C语言外部的简单应用。以至于经常出错之后都找不到错在哪里,或者听别人谈起堆栈之类的专业知识时只有个粗浅的认识,而不了解内部运行时的具体过程。
首先今天是第一天的学习,主要内容是一个内存四区的概念。内存包含了:栈区,堆区,全局区以及代码区。
其中代码区是存放加载到内存的即将要运行的代码,由系统管理,暂时不需要深入了解;
栈区是存放局部变量的内存空间,作用域结束后自动释放,存取方式是后进先出,先进的放在最高地址出,慢慢往下移动;
堆区是可以手动分配和释放的(malloc/new,free/delete),释放后需要将指向其内存空间的指针重新置值,否则指针继续指向该区间,然而该区间以及释放会被其他变量占用,则会出现崩溃等错误。另外堆中申请分配的内存空间需要释放,否则会造成内存泄漏,进而导致内存不够用而是程序崩溃。
全局区则是存放常量,全局变量,字面值,静态局部变量等,其生命周期和该程序一样,直到程序结束时才会被释放。
其次对于C语言非常重要的概念中先涉及到的有数组,指针,typedef,void。
数组,假设定义 int a[10]; 其中a单独使用则表示数组a[10]的首元素地址,与&a[0]等价,而&a则表示整个数组的首地址,若&a+1则表示数组a[10]之后的那个地址。
指针,也是一个对象,分配内存空间用以存放地址,32位机分配4个字节,64位机分配8个字节。指向指针的指针也是。指针也是有类型的,与要指向的对象的类型匹配。因为不同类型会分配不同的内存空间以及使用不同的处理方式。指针暂时先了解的这里,后面还会有许多相关内容。
typedef关键字应用比较少,其作用是为类型取别名,以简化再定义该变量,常结合结构体来使用。
void关键字使用非常广泛,主要有以下应用:
    函数参数为空时,可以用void修饰,int fun(void);
    函数没有返回值是:void fun(void);
    不能定义void普通变量;
    可以定义void *p,是万能指针,可以指向任意类型内存,可以进行强制类型转换来指定类型进行利用。未明确类型之前,该指针对象内部只可以存放地址,不可以对地址内存空间进行操作。
    总之C语言中要读写内存都必须要先明确内存空间里存放数据类型。
另外,函数的调用,其中的局部变量,静态局部变量等内容要进行相应处理。要了解其各个数据的生命周期可以通过画堆栈全局区的图进行分析,来排除因变量被释放后仍被调用所引起的错误。   

你可能感兴趣的:(Cnewbee,C语言进阶——01)