(C)关键字const,volatile,struct,union,enum

  • Post author:
  • Post category:其他



const:声明只读变量


1.const int * a; == int const *a;



*a(即所指的值)是不可以改变的,a(即所指值的地址)是可以改变的。

在编译时会出错,显示(*a)++为只读变量,不可以修改,当将这条语句注释后,会输出其值。


2.int * const a;(对于此类要先进行初始化)



*a(即所指的值)是可以改变的,a(即所指值的地址)不可以改变。

显示a为只读变量,所以 要在一开始要对a进行初始化,且不能写a++。


3.int const *const a; (要先进行初始化)



a不能修改,*a也不能修改。

volatile:对volatile变量的读写不会被编译器优化掉。


如volatile int i;则编译器不会对i进行优化,多用于硬件方面。


extern:表明变量或者函数的定义不在本文件中,或者拓展变量的使用范围。


拓展范围:


其他文件使用:

下图此时显示file2中a引用失败,因为static表明a只能在file1中使用,file2中只能重新定义。

函数也是如此,如果一个函数只能被本文件中其它函数所调用,称为内部函数(或静态函数)。定义时在函数类型前加static。

struct:多种数据组合起来的一个整体,其表现形式是一个结构体。


struct 结构体名


{


成员表列


}变量名表列;

struct结构体,只是构造出一个新的类型,并没有定义该类型的变量,因此在内存中并没有开辟任何存储空间;


1.1结构体定义(3种方法)

1).先声明结构体类型,再定义结构体变量。

2).在声明的同时定义变量

3).不指定类型名而直接定义结构体类型变量


1.2结构体变量的初始化和引用

1)在定义结构体变量时初始化

2)结构体变量名.成员名

3)嵌套定义( 注意date1必须要在stu前面定义)

4)同类结构体可以相互赋值


如下图:

一开始c的地址被instant1.cMember,然后instant1的值被赋给instant2(同类的结构体可以相互赋值),

此时1和2的指针都指向c,当2的指针修改c的值为b时

,instant1.cMember的值也会变成b

5)字符型数组不能直接赋值(要是用strcpy函数)


1.3 结构体数组的使用


struct 结构体名


{


成员表列


}数组[数组长度];


1.4结构体指针


1.指向结构体变量的指针:

不能用指向结构体变量的指针指向该结构体变量的某个成员。


访问结构体变量的三种方法:

注意:


2.字对齐问题


int型变量占四个字节,char占1个字节,后一个变量若能在前一个变量分配的空间中存放下,则后一个变量不再重新分配空间。


字对齐:申请的空间为4的倍数。(结构体存储方式)

半字对齐:申请的空间为2的倍数


union:当多种类型,多个对象,多个事物只取其一时


通过共用体查看字节序:

CPU存取数据都是从低地址开始开始存放,一个变量占用的内存空间往往不止一个字节,但是不同类型的CPU存放数据的顺序不同,因而产生了字节序的概念,按存放顺序的不同分为大端字节序和小端字节序两种:

大端字节序: 数据的高字节位存储在低地址对应的存储单元;

小端字节序:数据的低字节位存放在低地址对应的存储单元。

用共用体查看计算机的字节序:首先union有两个成员,分别为int,char,当int占用时会分配四个字节,而char占用时会分配1个字节,且将int赋值为1便于观察。当计算机为大端字节序时:输出为0,当为小端字节序时,输出为1


enum:枚举类型

enum默认初始化是在前一个成员的值上加1,若第一个成员的值没有,默认为0.可作为switch的标签。



版权声明:本文为qq_44836035原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。