Const的用法
1、在C语言中const修饰的变量不能通过变量名进行改写操作其本质还是变量而通过指针对其值进行修改是允许的
2、const修饰的变量会在内存占用空间
3、本质上const只对编译器有用在运行时无用
4、对其改写操作例如constinta=89;int*p=&a;*p=67;改写成功
5、现代的编译技术中在初期作为常量存入符号表然后后期要修改的时候临时分配空间并给他改变他的值然而下次使用的时候第一次使用的时候都是从符号表,
如果程序中const修饰的整个文件都是作为右值而不动地址就会只是单纯的替换如果程序中出现对该变量取地址操作时时就会到一直从内存里面取值读出。
作为左值时直接报错
6、在C语言中const修饰的数组是只读的
const修饰的数组空间不可被改变相当于指针和值都加了const,visualc++6.o可通过而c++中就绝对不允许这样操作的
7区别修饰的const
constint*p;//p可变p指向的内容不可变
intconst*p;//p可变p指向的内容不可变
int*constp;//p不可变p指向的内容可变
constint*constp;//p和p指向的内容都不可变
方法左数在右指*号出现的位置数据区就数据不可改变指针区指针不可改变
7、const修饰函数参数表示在函数体内不希望改变参数的值
const修饰函数返回值表示返回值不可改变多用于返回指针的情形
修饰函数指针表示返回的指针的指向是不准改变的
(注意可以通过其他别名或指针操作这块内存修饰符修饰的师某一个变量名的权限而没有限制的变量当然可以操作的)
Volatile的用法
1、volatile可理解为“编译器警告指示字”
2、volatile用于告诉编译器必须每次去内存中取变量值
3、volatile主要修饰可能被多个线程访问的变量
4、volatile也可以修饰可能被未知因数更改的变量
编译器选择的优化提高效率某些变量值在文件中一直到那个做左值编译器会直接从符号表中读取而当前线程睡眠将其他线程的线程开启如硬件中断如果线程改变其中得值数据从符号表中读取就会引起错误。不可预期的错误errorofexpectation
思考题volatile和const是否可以修饰同一个变量呢又有什么意以
答可以共存对于const来说应该理解为只读的意思如果一个变量被定义为const了那么它告诉使用者这个变量是只读的不要试图在当前的模块中改变它。而对于volatile来说它是告诉编译器这个被声明的变量可能在本程序之外被修改告诉编译器每次在使用这个变量的时候都需要重新加载不能优化。只读表示编译器不允许代码修改变量。但并不表示这个变量在其它地方不能够被修改。
第六节
Struct结构体变量
1、空结构体在计算机中占有多少内存c语言标准没有准确的指出所以不同的市场的厂商的理解有一个字节也有为空的一个字节的认为这样子用空结构体创建的变量的内存地址相同所以只能找最小的单位一字节这样子创建的两个结构体变量就不会相同了。
2、柔性数组即数组大小待定的数组
C语言中结构体的最后一个元素可以是大小未知的数组
C语言中可以由结构体产生柔性数组
Struct_soft\\结构体名
{
Intlength;
intarr[];
}softarr;
柔性数组占有的内存大小是结构体的长度的大小的成员所占的大小而无大小的数组是一个占位符不占有内存可直接使用
如何申请空间
Softarr*pst=(softarr*)malloc(sizeof(softarr)+len*sizeof(Typename));
使用pst->arr[i]......,(数据全部导入后该数组的大小还是成员变量的大小而数组变量
3、struct的成员变量的空间都是独立的自己申请的
Union
truct中的每个域在内存中都独立分配空间
union只分配最大域的空间所有域共享这个空
实用注意事项:
大端模式高地址放低位
小端模式低地址放低位
Enum
1、enum是一种自定义类型默认首元素为0以后类推的不断增加
2、enum默认常量在前一个值的基础上依次加1
3、enum类型的变量只能取定义时的离散值
4、Enum是真正的常量不用分配空间故无法取地址且只能初始化一次在定义的时候赋值其他的时候都不允许
6、#define宏常量只是简单的进行值替换枚举常量是真正意义上的常量
7、#define宏常量无法被调试枚举常量可以
8、#define宏常量无类型信息枚举常量是一种特定类型的常量
9、enum与const变量的区别enum是真正意义上的常量而const只是只读属性可以间接改变其值而且具有分配的内存可以获取地址。
Typedef的用法
Typedef的意义是什么
答Tyedef是对已经存在的类型进行重新命名而不是定义新的数据类型
1、typedef用于给一个已经存在的数据类型重命名
2、typedef并没有产生新的类型
3、typedef重定义的类型不能进行unsigned和signed扩展
4、ypedef是给已有类型取别名
5、#define为简单的字符串替换无别名的概念只在预编译的时候产生