C的数据类型有基本类型,构造类型,指针类型,空类型。
基本类型数据之间没有本质区别,只是解释内存中的数据方式不同,强制类型转换之后,并不会改变内存的实际内容,只是修改了解释方式而已。算术运算时,也是以该类型占用空间大小为单位。对于char型指针c,解引用时,会解析1个字节,算术运算时,也是以sizeof(char)为单位;对于int型指针b,解引用时,会解析4字节,算术运算时也是以sizeof(int)为单位。在判断系统的大小端时我们可以通过强制类型将将整型赋给字符型后的数据来进行判断。以下只讨论 union, void及void*变量类型。
1.union是一个联合体,是一种“类似”与struct的联合体。
可以用来存放几种不同类型的成员,但联合的所有成员引用的是内存中的相同位置,并且内存中的存储是按最长的那个变量所需要的位数来开辟内存的。每一时刻只有一个成员起作用,且起作用的是最后一个存放的成员。
2.void为“不确定类型”,不可以用void来声明变量,常用来函数返回类型及参数类型的限定。
1.对函数返回类型的限定:当函数不需要返回类型是必须用void 来限定返回类型,限定了函数的返回类型为void后函数不能有返回值;
如:void fun(int a);
2. 对函数参数类型的限定:当函数不允许接受参数时必须用void 来限定函数参数,限定了函数的参数类型为void后函数不能有参数;
如:int fun(void);
3."void* " 为“不确定类型指针”,可以用来声明指针
"void* "可以接受任何类型的赋值,也可以赋值给任何类型的变量 ,但需要进行强制转换;在转换为其他数据类型时,赋值给void* 的类型和目标类型必须保持一致。
在通用型接口中,你不知道用户的数据类型是什么,但是你必须能够处理用户的各种类型数据,常会使用到void*。void*能包容地接受各种类型的指针,使用的时候,转换为具体的指针类型(原始传入的是什么类型,然后转换成对应类型)。