数组
公有体
枚举
段字位
(本章节中例子都是用 VS2005 编译调试的)
一维数组------------------------------------------
形式:
类型 数组名 [常量表达式]
注意:
数组长度必须确定,下标由0开始
初始化:
说明:
标准 C++ 中,一旦你在数组定义时就对其使用 '{ }' 初始化,不论 '{' 与 '}' 之间的数值是多少(当然给比数组的上界小了)编译器会自动给你没有初始化的项用 0 初始化.与整型数组初始化相似,只是 int 使用的默认值为 0 ,而char型使用的是 '\0' .指针数组的初始化与以上初始化方式相同,使用默认值是 NULL ,而且初始化时可以使用值为 0 或 NULL
例子:
1 // 例1 -- 部分初始化 2 int a[5] = {1,0,3}; // 部分初始化即 a[0]=1, a[1]=0, a[2]=3,为初始化的值都为0,即 a[3]=0, a[4]=0 3 int b[5]; //定义有五个元素的数组,没有初始化任何元素,元素都为 0 4 5 6 // 例2 -- 全部初始化 7 int a[5] = {1,2,3,4,5}; 8 int b[] = {1,2,3,4,5}; //等价于上面那个数组,数组长度为{}里面的元素个数但是出现 9 int c[]; //错误, int 数组名[] 时候后面一定要初始化全部元素否则报错 10 11 12 // 例3 -- 调用数组元素 13 int a[5] ; 14 a[0] = 5; //将 a 这个数组的第一个元素即 a[0] 赋值为5
二维数组------------------------------------------
形式:
类型 数组名[常量表达式(行)][常量表达式(列)]
初始化:
例子:
1 // 例1 -- 分行初始化 2 int a[2][3]={{1,2,3},{4,5,6}}; 3 4 // 例2 -- 全员初始化 5 int a[2][3]={1,2,3,4,5,6}; 6 7 // 例3 -- 部分初始化 8 int a[2][3]={{1},{4,6}}; 9 10 // 例4 -- 调用数组成员 11 int a[2][3] ; 12 a[0][0] = 9 ; //将数组 a 第一行第一列的这个元素即 a[0][0] 赋值为9;
内存模型:
二维数组元素在内存中顺序排放,排列顺序是按行存放.即先顺序存放第一行的数组元素,然后存放第二行的数组元素,然後每行的數組元素是按重大到小的順序排列,依此类推
例子:
1 void main() 2 { 3 int a[2][3]={{0,1,2},{5,6,7}}; 4 5 cout<<endl; 6 for(int i=0; i<2; i++) 7 { 8 for(int j=0; j<3; j++) 9 { 10 cout<<"地址为 "<<(a+i)<<" 的a["<<i<<"] 值为"<<*(a+i)<<endl; 11 cout<<"地址为 "<<*(a+i)+j<<" 的a["<<i<<"]["<<j<<"] 值为: "<<*(*(a+i)+j)<<endl<<endl; 12 } 13 } 14 system("pause"); 15 }
輸出結果:
其數組內存模型為:
字符数组------------------------------------------
形式:
char 数组名[常量表达式];
初始化:
注意:
字符串面值的连接:
例子:
1 // 例1 -- 全部初始化初始化 2 char a[4]={'I','a','m','t'}; 3 char b[5]={"lamt"}; //这里的数组长度为 5 ,而不是4,因为字符串结尾需要一个标志结尾的字符 '\0' , 4 //所以长度是 5 也就是数组最小要长度为 5 ,而不是 4 5 char c[5]="lamt"; //同上 6 7 // 例2 -- 部分初始化初始化 8 char a[9]={'I','a','m','t'}; 9 char b[9]={"lamt"}; 10 char c[9]="lamt"; 11 12 // 例3 -- 调用数组元素 13 char a[5]; 14 a[0] = 'b' ; //这里将数组 a 的第一个元素即 a[0] 赋值为字符 'b' 15 a[1] = 63; //这里将数组 a 的第二个元素即 a[1] 赋值为ASII码值为63的这个字符值
[返回目录]
格式:
union 公用体名{
成员声明;
};
说明:
是一种数据格式,它能够存储,但只能同时存储一种类型,也就是说,结构体可以同时存储int,long与double类型的,某一时刻共用体只能存储int,long与double中的一种类型,共用体语法与结构体相似但含义不同,共用体在当数据项使用两种或更多种格式(但数据项不会同时使用一种以上格式)时可以节约存储空间
例子:
1 union U_v{ 2 short int a; 3 short int b; 4 int c; 5 }; 6 struct S_v{ 7 short int a; 8 short int b; 9 int c; 10 }; 11 void main() 12 { 13 U_v a; 14 a.a = 0; 15 a.b = 0; 16 a.c = 0; //初始化成员变量 17 cout<<"共有体的长度为 "<<sizeof(a)<<endl; 18 a.c = 9; 19 cout<<"修改共用体中的变量 c = 9 "<<endl; 20 cout<<"共用体的变量 a , b , c 值为: "<<a.a<<", "<<a.b<<", "<<a.c<<endl; 21 a.b = 6; 22 cout<<"修改共用体中的变量 b = 6 "<<endl; 23 cout<<"共用体的变量 a , b , c 值为: "<<a.a<<", "<<a.b<<", "<<a.c<<endl; 24 a.a = 5; 25 cout<<"修改共用体中的变量 a = 5 "<<endl; 26 cout<<"共用体的变量 a , b , c 值为: "<<a.a<<", "<<a.b<<", "<<a.c<<endl<<endl; 27 //可以看出变量共享同一个内存,所以改一个其他的内容也变了 28 29 S_v b; 30 b.a = 0; 31 b.b = 0; 32 b.c = 0; //初始化成员变量 33 cout<<"结构体的长度为 "<<sizeof(b)<<endl; 34 b.c = 9; 35 cout<<"修改结构体中的变量 c = 9 "<<endl; 36 cout<<"结构体的变量 a , b , c 值为: "<<b.a<<", "<<b.b<<", "<<b.c<<endl; 37 b.b = 6; 38 cout<<"修改结构体中的变量 b = 6 "<<endl; 39 cout<<"结构体的变量 a , b , c 值为: "<<b.a<<", "<<b.b<<", "<<b.c<<endl; 40 b.a = 5; 41 cout<<"修改结构体中的变量 a = 5 "<<endl; 42 cout<<"结构体的变量 a , b , c 值为: "<<b.a<<", "<<b.b<<", "<<b.c<<endl; 43 //可以看出变量有各自的内存,修改了某个变量,它对其他变量是没有任何影响的 44 system("pause"); 45 }
输出结果:
[返回目录]
格式
enum 枚举名 {
枚举常量/枚举成员
};
说明:
例子:
1 enum weekday{ sun,mou,tue=7,wed,thu,fri,sat }; 2 3 void main(void) 4 { 5 enum weekday a,b,c,d,e; 6 a = sun; 7 b = (weekday)1; 8 c = mou; 9 d = tue; 10 e = wed; 11 cout<<"the value a is "<<a<<endl; 12 cout<<"the value b is "<<b<<endl; 13 cout<<"the value c is "<<c<<endl; 14 cout<<"the value d is "<<d<<endl; 15 cout<<"the value e is "<<e<<endl; 16 system("pause"); 17 } 18 /***************************************** 19 输出结果 20 the value a is 0 21 the value b is 1 22 the value c is 1 23 the value d is 7 24 the value e is 8 25 请按任意键继续. . . 26 *****************************************/
解释:
在 weekday 其各个成员变量的值是 sun = 0 , mou = 1 , tue = 7 , wed = 8 , thu = 9 , thu = 10 , fri = 11 , sat = 12
在枚举成员中开头成员 sun 因为没有显示的给与其赋值所以为默认为 0 ,如果有显示赋值的话 sun 的值便为其赋值的值, 但枚举成员 tue 有显示的赋值为 7 ,所以tue = 7 , 其他的没有给定显示赋值的成员,值为前一个成员值加 1
由上我们终结出如何得知枚举变量成员中的值我们可以分三个步骤来看:
[返回目录]
定义:
由signed int或unsigned int中一组相邻的位,段字位由一个 结构声明建立,该结构声明为每个字段提供标签,并决定字段宽度
例:
struct {unsigned int aufd:4;unsigned int itals:2} prnt;
说明
①变量prnt被存放在一个int大小的存储空间里,但只有6位被使用
②带有位字段的结构允许在单个单元内存储多项设置
③位字段赋值要保证没有超过字符的容量
④不允许一个字段跨越两个unsigned的边界
例子:
1 struct Bit 2 { 3 char b8: 1;//低位 4 char b7: 1; 5 char b6: 1; 6 char b5: 1; 7 char b4: 1; 8 char b3: 1; 9 char b2: 1; 10 char b1: 1;//高位 11 }; 12 struct Not_Bit{ 13 char b8; 14 char b7; 15 char b6; 16 char b5; 17 char b4; 18 char b3; 19 char b2; 20 char b1; 21 }; 22 23 void main(void) 24 { 25 unsigned char *p = NULL; 26 Bit B; 27 Not_Bit n_B; 28 29 cout<<"this is Bit"<<endl; 30 B.b1 = 1; B.b2 = 1; B.b3 = 1; B.b4 = 1; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1; 31 //对Bit结构体赋值 32 p = (unsigned char *)&B; 33 cout<<"把 Bit 转化成 unsigned char 类型然后看看其值为: "<<(int)(*p)<<endl; 34 35 B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 0; B.b6 = 0; B.b7 = 0; B.b8 = 0; 36 //对Bit结构体赋值 37 p = (unsigned char *)&B; 38 cout<<"把 Bit 转化成 unsigned char 类型然后看看其值为: "<<(int)(*p)<<endl; 39 40 B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 1; B.b6 = 1; B.b7 = 0; B.b8 = 1; 41 //对Bit结构体赋值 42 p = (unsigned char *)&B; 43 cout<<"把 Bit 转化成 unsigned char 类型然后看看其值为: "<<(int)(*p)<<endl; 44 45 B.b1 = 1; B.b2 = 2; B.b3 = 3; B.b4 = 4; B.b5 = 5; B.b6 = 6; B.b7 = 7; B.b8 = 8; 46 //对Bit结构体赋值 47 //由于 B 中成员变量存放的都是字节,所以在赋给它们超过其容量时候会进行截取,即舍弃前面超出范围的部分 48 p = (unsigned char *)&B; 49 cout<<"把 Bit 转化成 unsigned char 类型然后看看其值为: "<<(int)(*p)<<endl<<endl; 50 51 52 53 54 55 cout<<"this is Not_Bit"<<endl; 56 n_B.b1 = 1; n_B.b2 = 1; n_B.b3 = 1; n_B.b4 = 1; n_B.b5 = 1; n_B.b6 = 1; n_B.b7 = 0; n_B.b8 = 1; 57 //对NotBit结构体赋值 58 p = (unsigned char *)&n_B; 59 cout<<"把 Not_Bit 转化成 unsigned char 类型然后看看其值为: "<<(int)(*p)<<endl; 60 61 n_B.b1 = 0; n_B.b2 = 0; n_B.b3 = 0; n_B.b4 = 0; n_B.b5 = 0; n_B.b6 = 0; n_B.b7 = 0; n_B.b8 = 0; 62 //对NotBit结构体赋值 63 p = (unsigned char *)&n_B; 64 cout<<"把 Not_Bit 转化成 unsigned char 类型然后看看其值为: "<<(int)(*p)<<endl; 65 66 n_B.b1 = 0; n_B.b2 = 0; n_B.b3 = 0; n_B.b4 = 0; n_B.b5 = 1; n_B.b6 = 1; n_B.b7 = 0; n_B.b8 = 1; 67 //对NotBit结构体赋值 68 p = (unsigned char *)&n_B; 69 cout<<"把 Not_Bit 转化成 unsigned char 类型然后看看其值为: "<<(int)(*p)<<endl; 70 71 n_B.b1 = 0; n_B.b2 = 2; n_B.b3 = 3; n_B.b4 = 4; n_B.b5 = 5; n_B.b6 = 6; n_B.b7 = 7; n_B.b8 = 8; 72 //对NotBit结构体赋值 73 //由于 n_B 中成员变量存放的都是字符型变量,所以在赋给它们的值都未超其容量,即没有发生舍弃 74 p = (unsigned char *)&n_B; 75 cout<<"把 Not_Bit 转化成 unsigned char 类型然后看看其值为: "<<(int)(*p)<<endl<<endl; 76 77 system("pause"); 78 }
输出结果:
分析:
让我来看看 B 与 n_B 两个变量的内存分配的模型吧,其中每个小红框框代表一个字节位
那么现在我们在看看代码中的的两个句
1 //-------------------------------------------------------------------------------- 2 //先看看关于 B 变量 3 p = (unsigned char *)&B; 4 //那么 B 这个结构体变量只有 8 字节位刚好是一个 unsigned char 变量的内存大小所以 B 在发生强制转换的时候没有丢失数据 5 6 //-------------------------------------------------------------------------------- 7 //再来看看关于 n_B 变量 8 p = (unsigned char *)&n_B; 9 //此时 n_B 变量强制转换为 unsigned char 变量,我们在看看那上面 n_B 的内存分配,明显它有 8 个字符变量成员,所以它所占的内存是 64 字节位 10 //那么它转换后的的内存模型就剩下 8 字节位(既成员变量 b8 ),丢失 n_B 余下的 56 字节(即成员变量 b7 到 b1) 11 //所以在那些输出结构其实都是变量 b8 的数据内容
[返回目录]