C语言数据类型分为基本类型和派生类型,派生类型是指从某些类型派生出来的类型。
基本数据类型如下:
- char
- int
- float
- double
在基本数据类型前可以加一些限定符:short和long也是两个限定符。
short int sh;
long int counter;
以上的类型声明中,关键字int可以省略。以下为写法都是相同的情况。
推荐使用 | 同义的类型 |
char | |
signed char | |
unsigned char | |
short | signed short,short int,signed short int |
unsigned short | unsigned short int |
int | signed,signed int,无指定类型 |
unsigned int | unsigned |
long | signed long,long int,signed long int |
unsigned long | unsigned long int |
float | |
double | |
long double | |
long long |
基本类型所占内存的大小必须依赖处理环境进行计算。
派生类型如下:
- 指针
- 数组(”元素个数”,作为属性)
- 函数(参数信息作为属性)
- 结构体/联合体
- 不完全类型
1.指针
由引用类型T派生的指针类型有时称为“指向T的指针”。对于指针类型来说,因为它指向的类型各不相同,所以都是从存在的类型中派生出“指向T的指针”。
对指针进行加法运算,指针只前进指向类型的大小的距离。例如:指向数组的指针。
int array[3]; //array可以被解读成指向数组初始元素的指针。
int (* array_p)[3];//指向数组的指针。派生过程:由基本类型int派生出数组,再由该数组派生出指针。
array_p = &array;//正确
array = &array_p;//编译器会报错
array与array_p区别:当对array_p进行加1时,指针会前进12(int长度乘以数组长度=4*3=12)个字节。
指针所占内存的大小也是依赖处理环境,与派生源的大小无关,指针的大小是固定的。
2.数组
数组类型本质就是将一定个数的派生源的类型进行排列而得到的类型。
数组占内存的大小 = 派生源的类型大小 × 数组的元素个数
3.函数
函数类型与其他派生派生类型的区别:无论是int、double、数组、指针、结构体,只要是函数以外的类型,大体都可以作为变量被定义。而且,这些变量在内存中占用了一定的空间。并且可以通过sizeof运算符取得他们的大小。而函数类型在C语言中没有固定的长度,所以不存在函数类型的变量。
所以不存在由函数派生的派生类,例如:
- 函数类型的数组
- 行数类型生成的结构体或联合体
函数无法计算大小。
函数类型是不能派生出除了指针以外的其他任何类型。
C语言中数组不能作为函数的返回值。所以数组也无法派生出函数。
4.结构体和联合体
结构体在声明中它和数据类型修饰符(也就是int、double)处于相同的位置。
5.不完全类型
在被声明的时候还不知道其内容,所以无法确定大小,这样被叫做不完全类型。不能派生出数组、不能作为结构体成员、不能声明变量。
struct Man;//这种声明就是"不完全类型"
struct Woman{
struct Man *husband;
};
struct Man{
struct Woman *wife;
};
上面的例子中在Man被定义完内容以后,Man就不是不完全类型了。