一、数据类型
1、基本数据类型
类型 | 说明 | 16位编译器 | 32位编译器 | 64位编译器 |
---|---|---|---|---|
bool | 布尔型,不同编译系统会有所差异 | 1 | 1 | 1 |
char | 字符型 | 1 | 1 | 1 |
char* | 指针变量 | 2 | 4 | 8 |
(unsigned) int | 整型,不同编译系统会有所差异 | 2 | 4 | 4 |
float | 浮点型,表示实数,但在printf的变长参数中float会自动转为double,即参数变成8字节 | 4 | 4 | 4 |
double | 双精度浮点型 | 8 | 8 | 8 |
short int | 短整型,int可省略 | 2 | 2 | 2 |
(unsigned) long int | 长整型,int可省略 | 4 | 4 | 8 |
long long | 8字节 | 8 | 8 | |
long double | 多精度浮点类型或长精度浮点类型,有16字节、12字节、8字节,大多数是16字节,取决于编译器 |
除bool型外还有两大类:整数和浮点数。char型的本质是整型,是一个字节的整数,用于存放字符的ASCII码。而关键字signed和unsigned、short和long起修饰作用。long型固定占4字节,可修饰int和double。
signed和unsigned可以用来修饰char型、int型、short型和long型。signed表示有符号数,unsigned表示无符号数。有符号数以二进制补码形式存储,最高位为符号位,“0”表示正,“1”表示负。无符号整数只能是正数。char型、int型、short型和long型默认情况下是有符号(signed)的。
注意:int、long int、short int的宽度都可能随编译器而异。但都应遵循以下:
1)sizeof(short int) <= sizeof(int)
2)sizeof(int)<=sizeof(long int)
3) short int至少应为16位(2字节)
4)long int至少应为32位
2、常量
常量就是:在程序运行过程中始终不会变的量,就是直接用文字表示的值。常量有整型常量、实型常量、字符常量、字符串常量和布尔常量。
常量类别 | 说明 |
---|---|
整型 | 包括正整数、负整数和零。八进制常量的数字必须以数字0开头,如0324;十六进制常量的数字必须以0x开头,如0x2c |
实型 | 是数学上的小数,有两种表示形式:一般形式和指数形式。一般形式:11.9;指数形式:0.2E+2(0.2 * 10^2) |
字符 | 单引号括起来的一个字符,如’a’,‘’,以及一些不可显示的字符,如换行、制表符等 |
字符串 | 用双引号括起来的字符序列,如"test"等,字符串常量会在字符序列末尾添加’\0’作为结尾标记 |
布尔 | true、false |
3、变量
变量的值是可变的,在使用之前必须先对类型和名称进行声明。变量声明的格式:数据类型 变量名1,变量名2…
4、符号常量
给常量起一个名字,这个常量就是符号常量。符号常量声明形式:const 数据类型说明符 常量名=常量值; 或 数据类型说明符 const 常量名=常量值;。需注意符号常量声明时必须赋初值,在其他时候不能改变它的值
5、自定义数据类型
像char、int、float等类型都是C++内置的基本数据类型,这些数据类型是不能满足我们在真实项目中的需要的,这种情况下就需要我们自己定义一些数据类型使用。如枚举类型、结构类型、联合类型、数组类型和类等。
5.1 枚举类型
枚举类型的声明形式为:
enum 枚举类型名
{
变量值列表
};
变量值列表里都是整型变量,另外不要忘记最后面的分号!
枚举元素没有指定值的情况下,就使用默认值,依次从0开始,若指定枚举元素的值,则根据枚举元素的值来依次递增。枚举元素是按常量处理的,在声明的时候只就已经确定了。整数值需要赋给枚举变量时,应进行强制类型转换。
typedef enum _COLOR_TYPE_
{
enumRED,
enumGreen,
enumGrey,
...
}enumColorType;
5.2 结构体
在实际项目开发中,我们有时候需要将一些不同类型的数据组合成一个整体现有的数据类型不能满足改需求,这就需要我们定义一个结合体使用,由不同数据类型也可以是相同数据类型的若干数据组成的结合体就是结构体。
struct 结构体名
{
数据类型 成员名 1;
数据类型 成员名 2;
...
数据类型 成员名 n;
};
最后那个分号不要忘记!
在定义了结构体类型之后,就可以用来定义对应的结构体变量。结构体成员的使用形式是:结构体变量名.成员名。
typedef struct _STUDENT_INFO_
{
int nIndex;
char szName[32];
int nSex;
int nAge;
float fScore;
}StudentInfo, *PStudentInfo;
5.3 联合体
有的时候需要几个不同类型的变量共用一组内存单元,这时就需要用联合体,联合体类型声明的语法形式为:
union 联合名
{
数据类型 成员名 1;
数据类型 成员名 2;
...
数据类型 成员名 n;
};
联合体类型变量声明的语法形式是:联合体类型名 联合体变量名;。联合体类型变量的引用形式是:联合体变量名.成员名。
联合体是共用内存单元的,同时只会存在一个成员的值。那么联合体在内存中是怎么占用内存的呢?联合体占用的内存大小是其占内存最大的成员需要的内存大小,如下:
union _UNION_DATA_
{
char cData;
int nData;
long long lData;
}uData;
最大成员是long long,需8字节。因此若uData存放cData的话,则占用前一个字节;放nData则占用前4字节(32位编译器);放lData则占用全部8字节。
联合体也可以没有名称,这种是无名联合体。无名联合体只是声明一个成员项的集合,这些成员有相同的内存地址,一般是作为结构体的内嵌成员存在,可以用成员项的名字直接访问,如下:
union
{
int nSize;
float fScore;
}
在程序中可以直接使用成员项进行访问,如nSize=4;fScore=89.5;
union uSetValue
{
int nFirst;
struct {
int nSize;
int nWidth;
int nLen;
}stValue;
}unionSetValue;
int _tmain(int argc, _TCHAR* argv[])
{
unionSetValue.stValue.nSize =4;
unionSetValue.stValue.nWidth =5;
unionSetValue.stValue.nLen =6;
unionSetValue.nFirst = 0;
cout<<unionSetValue.stValue.nSize<<" "<<unionSetValue.stValue.nWidth<<" "<<unionSetValue.stValue.nLen<<endl;
return 0;
}
以上输出0 5 6.为什么?联合体是共用内存的,该最大占用12字节,因为最后给unionSetValue.nFirst赋值了,因此前4字节(保存unionSetValue.stValue.nSize的位置)被覆盖了,原有的值变成了unionSetValue.nFirst到的值。