一、关于变量的存储。
1、变量的属性包括:存储类型+数据类型。存储类型包括:auto、static、register、extern.四种。
定义变量的格式:存储类型+数据类型标识符+变量名标识符。
2、静态局部变量的含义:当函数第一次调用完毕返回后,变量空间不释放。而不是变量的值不改变。
3、静态全局变量中定义的static的作用是限制变量作用域(文件之间的作用域)。
a源文件中动态全局变量(声明为auto或缺省存储类型),可被b文件用extern使用。
若全局变量声明为静态,则不能被其他文件使用。
4、由register定义的寄存器变量,当反复进行运算时,将变量存储在CPU的内部寄存器中,从而避免每次访问内存,以提高运行效率。
二、关于数值在内存中的表示。
1、在进行字符型与整型的互换时,一定注意字符型是有木有符号。
2、浮点数在内存中是以指数的方式存放的,并不是二进制精表示,因此在运算的时候不同的运算带来的舍入过程是不同的。
因此浮点数并不能进行准确的比较,在比较的时候,可采用这种形式:if(abs((x+y)-z)<D) 精度范围控制在D内即可,eg、D=10e-6
3、return语句使用时:1、表达式最好不省略。2、return语句千万不能返回一个局部变量指针。
4、void只用来定义返回值和参数,表示相应的类型为空。当用void定义一个指针后,其他类型的指针可以直接赋值给void指针,但void指针赋值给其他指针时必须使用强制转换。·(原因是编译器需要根据指针类型来确定读写从指针开始多少字节空间的数据。)
5、int const a=10 等价于 const int a=10,表示变量a的值不变,注意:在定义的时候必须同时赋值。
当const定义指针时,情况复杂:const int *p等价int const *p,表示指针内容不变,指针可变。int *const p表示指针不变,指针内容可变。const int* const p表示指针及其内 容都不变(就看const离谁最近)
const最多的运用是在限制函数的参数,防止调用次函数时,次函数对主函数内部内容进行无意传址修改。这在多人合作开发中维持函数独立性显得非常重要。
6、关于指针。
指针的类型和指针所指内容的类型严格意义上讲不同,但讨论指针的类型并没有太大的意义,在32位机器上都为指针类型分配四个字节。我们经常所说的指针的类型就是指 指针所指向内容的类型。
常见指针的识别方法:去掉*p,剩下的为p所指向内容的类型。
int *p p所指向的内容存放整形变量。
int *p[5] p为5个元素的数组,每个数组中存放一个地址,改地址所指向的内容为整型。//指针数组
int (*p)[5] p指针所指向一个具有5个整型·元素数组的首地址。//数组指针
int **p 指向指针的指针。
7、关于存储模式
计算机的存储空间是按照字节寻址的。多字节数据在存储空间上是连续的,其数据对象的地址等于最低位字节的地址。
存储方式有两种:大端模式和小端模式。大端模式:数据的高位放在低地址字节中,低位放在高地址字节中。小端模式:数据的高位放在高低址字节中,低位放在低地址字节中。
基于此产生的二进制文件在不同的系统中可能不同,就会造成数据的传输出错。C语言提供了一些转换函数:htonl、htons、ntohl、ntohs。
三、结构体和共同体
1、结构体的空间的字节数不要自己去算,要用sizeof测试(保留字,不是函数)。因为编译器在存放结构体变量的各个成员时,并不一定连续存储,可能采取字对齐或者双字对齐,进而留有空隙,故实际分配的字节数大于等于你所计算出来的值。
2、共同体:将几种不同类型变量存放在同一内存单元的结构·,所有·成员共用一块内存空间。某段时间内中有一个成员起作用。
四、常见内存错误
1、程序中使用的内存被分为三部分:静态区、动态区(栈)、堆。
静态区保存全局变量、静态局部变量。动态区保存局部变量以及函数调用过程中现场的保存。堆,动态分配的空间。一般由malloc函数分配,free函数释放。
2、常见的内存错误有:(1)指针未初始化(2)指针、数组越界(3)使用已释放的空间(4)内存泄露
内存泄露表现为刚开始程序运行正常,一段时间后系统崩溃。很可能是因为动态分配没有释放内存。