C语言回忆录1--数据类型
1、数据类型
a.概念:什么是数据类型?
简单点儿来说,数据类型就是计算机对现实中数据的一种抽象和表示,比如现实中的数字,字母,文字,图形等等,由于每种数据所含的内容不同,所需要的内存空间也不同,为了能够用适当的内存大小去表示数据,因此才有了整型,浮点型等数据类型,这些类型本质上只是所分配的内存空间大小不同。为了能够表示现实中一些复杂的关系,又出现了构造类型等来表示,更复杂的一些可以参考数据结构这方面的资料。
b.分类:数据类型的分类
- 基本数据类型
- 字符型 char
- 短整型 short
- 整 型 int
- 长整型 long
- 超长整型 long long
- 单精度浮点型 float
- 双精度浮点型 double
- 长双精度浮点 long double
- 构造类型
- 数组类型 int array[9];
- 结构体类型 struct abc { };
- 枚举类型 enum abc{};
- 联合体类型 union abc{};
- 位域型 int a:3;
- 指针类型分类
- 数据指针 int * p=&a;
- 函数指针 int (*f) (void );
- void类型分类
- void 指针类型 void * p;
- void 函数类型
- void 参数类型
c.基本数据类型
类型 | 字节 | 范围 |
---|---|---|
(signed) char | 1 | -128~127 |
unsigned char | 1 | 0~255 |
short | 2 | -32768~32767 |
unsigned short | 2 | 0~65535 |
(signed) int | 4 | -2147483648~2147483647 |
unsigned int | 4 | 0~4294967295 |
long int | 8 | -9223372036854775808~923372036854775807 |
unsigned long int | 8 | 0~18446744073709551615 |
long long int | 8 | 同 long int |
unsigned long long int | 8 | 同 long int |
float 有效数字(6,7) | 4 | -3.410^-38~3.410^38 |
double 有效数字(15,16) | 8 | -1.710^-308~1.7*10^308 |
long double 有效数字(18,19) | 16 | -1.210^-4932~1.210^4932 |
注:由于不同平台的数据类型占用大小不一样,具体占用字节可以使用sizeof(T)得出
对于这些不同的类型,在使用的时候要注意所需要表示的数据大小,来选择合适的数据类型,避免内存的浪费。
浮点型也被称为实型,就是小数的表示类型,由于计算机中内存有限,并且整型的运算速度比较快,因此将数据分为整型和实型来表示。
举个栗子,对于班级学号的表示,一般只需要unsigned char 类型就可以表示了,只需要一个字节,如果使用int,则需要4个字节,造成了内存的浪费。下面是一些实例:
eg:
int intValue=4;
char charValue='a';
long int longValue=2323223;
long long longlongValue=22222121212;
所定义的变量要注意使用范围,不要溢出
//这是个测试系统基本类型占用字节的代码
#include <stdio.h>
void main()
{
printf("char is %d\n",sizeof(char));
printf("short is %d\n",sizeof(short));
printf("int is %d\n",sizeof(int));
printf("long int is %d\n",sizeof(long int));
printf("long long int is %d\n",sizeof(long long int ));
printf("float is %d\n",sizeof(float));
printf("double is %d\n",sizeof(double));
printf("long double is %d\n",sizeof(long double));
printf("Hello,Data Type!\n");
}
d.构造类型
构造类型是由基本数据类型组合所得到的,主要由数组,结构体,联合体,枚举类型等组成,其中比较常用的是数组以及结构体类型
d.1数组
数组就是若干个相同类型的的数据的集合,其作用是简化了我们定义的繁琐程度,假如一个班里有50位学生,为了表示他们的成绩,我们需要定义50个变量来表示他们,需要写一大串程序,如果使用数组就比较方便了,数组的本质上是在内存空间里开辟连续的若干个相同的某种基本数据类型大小的内存空间,程序的本质最终都会反映在内存的改变,不仅要知道程序的表象,更要深入其本质去理解内存的变化。
-
定义: 基本类型 数组名[num1][num2][....];
eg: int a[10]; float f[4]; double dou[5];
-
分类:严格来说,数组并没有所谓的分类,一般根据我们的需要来定义不同维度的数组,常用的多为一维和二维数组。
int one[10] ; //这是一维
int two[10][2]; //二维
int three[10][2][3]; //三维 一般用到三维就不错了 -
引用方式: 数组定义后就可以使用了,引用和定义方式差不多,定义的时候[]内的数字代表数组的大小,引用的时候代表数组中某个元素的索引,我们习惯上使用下标这个词来称呼它。值得注意的是,数组引用的时候序号最大为数组大小-1,从0开始引用。
//定义了一个10个int元素的数组
int array[10];
//引用
array[0];//这里引用了array数组中的第一个元素
array[9];//这里引用了array数组中最后一个元素 -
数组和指针的关系: 其实指针和数组的访问是可以相互转化的,他们之间的关系比较复杂,这里就不多加赘述了,如果有需要的可以去查阅相关资料。
d.2结构体
结构体是用来表示复杂关系的一种可以自定义的数据类型,和面向对象中的类相似,一般情况下只将数据放在结构体中,而类class则将函数(方法)一起放在类中。
-
定义结构体: 结构体的定义比较灵活,以struct关键字开始,接着是结构体类型名和大括号,结构体类型名也是可以省去的,这时候需要直接定义结构体变量。
struct 结构体类型名 { //成员表列 }; //注意末尾的分号不能少 eg: struct student { char name[20]; int age; int height; char sex; float score; };
-
定义结构体变量:定义结构体指的是定义一种新结构体类型,比如student结构体类型,定义结构体变量是指用这个新的结构体类型来定义一个变量。
struct student a,b; //此处定义了两个student 类型的变量a,b
struct student * P; //定义了一个结构体指针变量 -
结构体成员变量的引用:结构体变量的引用有两种方式,一种是结构体变量名+小数点+结构体成员变量名,另一种是结构体指针变量+->+结构体成员变量名。
struct student a,*p;
a.name="ciqujingnian";
a.age=23;
p->height=170;
p->sex='m';
d.3枚举类型
枚举类型采用关键字enum来定义,主要是定义一些字符串来代表一些数字代码,枚举类型的成员变量实质与int类型没有什么区别,使用枚举类型的作用主要是增加程序的可读性。
- 定义:enum +枚举类型名+ {成员}变量名列表
eg:
enum day
{
MON,
TUE,
WED,
THU,
FRI,
SAT,
SUN
};
enum day today;//定义一个day类型的变量today
枚举类型中成员的值默认是从0开始以1递增的,也可以指定某一个成员的值,此成员之后的值将会以这个成员的值开始以1递增
- 引用:定义了某个枚举类型的变量之后便可以使用此变量了,不过此变量赋值时只接受枚举类型的成员值。
enum day today;
today=MON;
today=SAT;
其实,任意的int类型的数字都可以赋值给枚举类型的变量,但是要添加enum 类型名强制转换,转换后这个枚举变量的值已经不是枚举类型中枚举成员的值了,也就失去了枚举变量的作用和意义。
d.4联合体类型和位域类型
联合体类型和位域类型使用的不多,这里就不赘述了。