C语言中数据类型是什么重要的,他们是定义变量的基础。C语言中数据类型大体上可以分为:基本数据类型,构造类型,指针类型,还有枚举。今天我把自己这几天所学的在这里总结一下。
1:基本数据类型
1>: int 类型,可以表示所有的自然数。在不同的编译器中它在内存中占据的字节数也是不一样的,一般占据4个字节。 在printf 中输出时以%d 作为格式符。它又分为好几中小的类别.
short 和 long 可以改变数据的长度,即数据所占的内存的字节数: 当用 short 和long修饰 int 时:
1: short int 也可以写为 short 两者是完全等价的。 short int 在内存中占据了两个字节。在printf 中输出时也以%d 作为格 式符。
2:long int 是长整型,也可以写作 long 在内存中占据8个字节。输出时以% ld ,作为格式符。
3: long long int 等价于 long long ,内存中也是占据8个字节。输出时以 % lld 为格式符。
4:unsigned 和 signed 只能改变最高位代表的意义:
5: signed 代表数据有符号,最高位作为符号位。可表示正整数,0,负数。signed int 等于 signed 又等于 int, 因为系 统内部int 时默认为有符号的,所以singned 写跟没写没啥区别。在printf 中输出时以%d 作为格式符。由于它的最高位作 为符号位因此它的取值范围为 - 2的31次方-1 到正的 2的 31次方 -1 。
6:unsigned 代表数据没有符号,最高位不当作符号位用,因此它正整数和0..取值范围比signed的大,取值范围为: 2的 32次方-1 。unsigned int 等于 unsigned ,在printf 中输出时以 %u 作为格式符。
2>:char 类型
char 类型在内存中只占据一个字节的存储空间。在printf 中输出时以 %c 作为格式符。一次只能输出一个字符。也可以 用 %d 作为格式符输出一个字符常量,因为char 的好多字符在内存中存储都是以它们相对应的ASCII码值转化为二进制来存 储的,所以也可以以整型输出。
3>:float 和 double 类型
1: float 代表小数,在内存中占据4个字节,在printf 中输出时以%f 作为格式符。输出时默认为输出6位小数。
2:double 也是代表小数,在内存中占据8个字节,在printf 中输出时也以%d 作为格式符,也默认为输出6位小数。
%.2f 代表输出时 小数点后输出两位小数。
4>:构造类型
1:数组:用来存储一组有顺序的数据。
只能存放一种类型的数据,里面存放的数据成为元素。
格式: 元素类型 数组名[ 元素个数 ];
元素的下标从0 开始,直到元素总数 -1。
例如:定义一个数组,并初始化
int arry [ 5 ]:
arry [5 ] = {1,2,3,4,5,};
也可以 int arry [ 5 ] = {1,2,3,4,5,};
选择性赋值:int a [5 ] = { 1,2} ;
// 只给数组前两个元素a [0], a[1] 赋值。
或者 int a [5] = { [3]=4,[4] = 5 };
// 指定把 4的值赋给 a [3], 5 赋 给 a [4]。
int a [ ] = { 1,2,3 } ;
// 可以省略元素个数;系统默认为有3个元素.
还可以 :int b [ 'a' ] ={ 1,2,3,4,5,6 } ;
这样写是正确的,因为'a ' 得 ASCII 码是97,可以作为字符常量来用。
如果在定义数组的同时进行初始化,数组元素个数必须是常量,或者不写,或者常量表达式。
例如:int a [ count ] ={1,2,3,4 }; 是错误的写法。
数组元素个数为变量时,不能同时对数组进行初始化。
计算数组元素个数: 例如 int a [n];
可以用: n= sizeof(a )/ sizeof( int );
// 因为int 型数据在内存中占据4个字节。
二维数组 : 元素类型 数组名 [ ] [ ] ;
例如: int a [ 2 ] [ 3 ] ;
二维数组是特殊的一维数组,它的元素为一维数组,相当于 2 行 一维数组。 每个一维数组中有三个元素。
初始化时 int a [ ] [ 3 ] = { {1}, {2}, {3} } ;
// 第一个元素数可以省略 ,但是第二个必须要有。
2:结构体
可以分为两步,一先定义结构体类型,二再根据结构体类型定义结构体变量。
例如:先定义一个结构体变量 struct DATE
struct DATE
{ int year;
int month ;
int day ; };
在根据类型定义变量:
struct DATE a = { 2015, 4, 21};
struct DATE b ;
或者同时定义变量:
struct DATE
{ int year;
int month ;
int day ; } a ;
或者 这样赋值: a.day = 21;
或者 struct DATE a = { .year=2015, .month = 4 , };
b=a ; // 将 a 的所有成员的值对应赋值给b 的多有成员。这句执行之后就相当于:
struct DATE b = { 2015, 4,21};
结构体和数组都可以存放一组数据,可是结构体可以由多个不同类型的数据构成。需要注意的是,定义结构体类型时系统不会分配存储空间,只有在定义结构体变量时才会分配存储空间。且结构体所占用的存储的空间必须是 最大成员字节数的整数倍。结构体类型不可重复定义。
也可以这样定义结构体:
struct
{ int year;
int month ;
int day ; } c ;
不写结构体类型名,这样的结构体可以重复定义,但是这种结构体不可以重复使用,每次使用都要重新定义一次结构体类 型。
由于结构体类型是程序员自定义的,并非系统自带的,所以结构体类型的作用域,从定义类型的那一行开始,一直到代码块结束。
结构体数组:
例如struct DATE
{ int year;
int month ;
int day ; } ;
赋值:1: struct DATE d [3] ={ { }, { }, { } } ;
2: struct DATE d [ 3 ];
d [ 0 ].year = 2015;
错误写法: d [ 0 ] = { 2015, 4, 21}; // d [ 0] 是一个数组,里面有三个元素,d[0 ] 代表数组的地址,也就是数组首元素的地址。
3:结构体的嵌套
struct DATE
{ int year;
int month ;
int day ; } ;
struct student
{ int num;
struct DATE birthday ;
struct DATE ruxueriqi ; } ;
struct student e = { 1,{ }, { } };
注意:结构体只能嵌套别的结构体类型,不能自己嵌套自己。
4>:枚举类型
在枚举类型中,变量只允许有几个固定的取值。
定义枚举: enum 枚举类型名
{ 值1,
值2 ,
...... , } ;
这些值也都只能是整型常量,往后依次递增。
定义枚举变量:
enum 类型名 变量名 = 值;
// 这个值只能从上述的枚举值中取。
例如: enum season
{ spring,
summer,
autumn,
winter,
};
enum season a = spring ;
并且枚举中的值都是整型常量。