基本数据类型有4中,整形,浮点型,指针,聚合类型(数组啊,结构体啊,自定义啊)
整型
整型有,字符,短整型,整型和长整型。这4个都是分为有符号和无符号。
(亲们,计算的容量有限,你们定义的时候,能用小的就别用大的。否则,后果自负)
讲一个特别爽的思想。
标准的c语言中,没有规定长整型要比短整型长,但是规定了长整型不能比短整型短。就是说你定义的时候可以写long int a=333;short int a=333;但是不能定义long int a=33,short int a=333;。这个看着没什么,实际上很爽的。就是说你如果浪费内存空间,程序不会鸟你~~
但是却最大程度上的允许了程序员的灵活性。c语言的思想就是灵活。
范围就是一个表。那个表我懒得搞了,百度去。
要注意,计算机存值的时候不是连续的,是一堆点。你看着是连续的是因为你看不见计算机运行的过程。
变量范围的限制也是一张表,但这个比较重要,思想重要,俺说一下~~~
这个就是各种类型的范围。字符型看起来是字符,实际上是最小的整形。char可能是有符号的的,也可能是无符号的。在不同的机器上面char就有了不同的范围,于是乎c语言的可移植性就大大加强了。
在c语言设计之初,这个就看似无聊的举动,实际上包含了设计师匠心独运的灵感。每次俺看到这里的时候都有一种兴奋的感觉。
然后就是个比较简单的东西了,char是最小的整型,所以字符那些什么的实际上是ASCII码中,各个符号和0~127之间的书的对应。c语言只不过翻译了一下而已。
整形字面值
字面值是字面值常量的缩写,这个是一种实体,指定了自身的值,并且不允许发生改变。因为ANSIC允许常量命名,(named constant)他和普通变量很相似,区别在于它被初始化之后,他的值就不能在改变。
当一个程序中出现了整形的字面值,他的类型取决于他是如何书写的。可以在有些字面值后面添加一个后最来改变缺省的规则。
在整数后面加上L或者是小写的L,可以把这个整数解释为long整型值。字符u或者U用于把树枝指定为unsigned。
十进制整形字面值肯呢过是int,long,unsigned long。在缺省的情况下,他是最短类型但是能够完整容纳这个值。
整数也可以用八进制表示,只要在数值前面以0开头,十六进制用0x开头。如023;0xabc。
字符常量的类型总是int。字符常量就是一个用单引号包围起来的当个字符(转义序列,三个字母词)如'm','\n','\377'.
标准c中允许'aasdf'这样写,但是在不同的环境中意思可能不一样。
一个多字节的自发常量前面有一个L,那么他就是宽字符常量(wide charracter literal)。例如 L'x'(不懂这个用什么用)
枚举类型
枚举类型指的是他的值为符号常量而不是字面值的类型。例如
enum jar_Type{CUP,PINT,QUART,HALF_CALLON,CALLIN};
这个语句就声明了一个类型,这个类型称之为jar_Type.这种变量声明方式:emun jar_Type milk_jug;
如果某种特别的枚举类型的变量只是用一个声明,则可以这样写:enum {CUP,PINT,QUART,HALF_CALLON,CALLIN} milk_jug;
这种类型的变量实际上是用整型的方式存储,这些符号明的实际值都是整型值。
一般情况下避免将符号名赋值给整型变量。
浮点类型
浮点数家族包括float,double,long double~~~
同样,ANSI标准仅仅规定了long double至少和double一样长,而double至少和float一样长。
标准c有一个规定,所有浮点数类型至少能够容纳从10的-37次都10的37次之间的任何值。
头文件float.h中规定了FLT_MAX,DBL_MAX LDBL_MAX以及FLT_MIN,DBL_MIN LDBL_MIN这些表示float,double已经long double能够表示范围。浮点数字字面值在缺省的情况下都是double类型,除非后面有l或者L,表示为long doubl或者,f或F表示float的值。
指针 (蛋疼玩意儿)
变量的值存储于计算机的呢村中,每个变量都占据了一个特定的位置。每个内存地址都是有地址唯一确定并引用。指针只是地址的另一个名字罢了。
可以将计算机的内存想想成一条长街上的一间间房子,每个房间都用一个唯一的号码进行标识,每个位置包含一个值,这儿值和他的地址明显不一样。
指针常量
指针常量和非指针常量在本质上是不同的,因为编译器负责吧变量值赋值给计算机内存中的位置,程序员事先无法知道某个特定的变量存储到内存中的那一个位置,因此你通过操作符获得一个量的地址而不是直接把他的地址写成字面值的常量形式。 而且我们不知道内存中某个地址是否存值,存的什么值,所以把指针常量表达式位数字字面值基本上没有什么用。
字符串常量
字符串就是一串以NULL字节结尾的零个或者多个字符。字符串通常存储在字符数组汇总。由于字符串是以NULL结尾,所以一般字符串中不能包含NULL。其实这样没有什么限制,因为NULL不是一个可以打印的字符。
字符串常量一般写法"goodbye world~"
在字符串唱的存储形式中,所有的字符和NULL终止符都存储在内存的某个位置。K&Rb并没有提及一个字符串常量中的字符是否可以被程序修改,单他清楚表明局用相同的值的不同字符串常量是在内存中分开存储的。
ANSIC则声明吐过对于一个字符串常量进行修改该,其效果是未定义的。他允许将一个字符串常量存储于一个地方,即使他在程序中多次出现,这就使得修改字符串常量变得特别危险。
所以要存储字符串,存到数组里面吧~~~
字符串常量会生成一个“指向字符的常量指针”。当一个字符串常量出现于一个表达式中时,表达式所使用的值就是这些字符所存储的地址,而不是这些字符本身。所以可以将一个字符串常量赋值个一个“指向字符的指针”,后面指向这个字符所存储的地址,但是字符串常量不能赋值给一个字符数组。因为字符串常量的直接值是一个指针,而不是字符本身。
字符串的操作在标准库函数中有一套函数。这个放到后面说。
以上是书上的。
其实说了三点:
1、指针就是地址。
2、子字符串常量最好不要修改。最好放到数组里面。
3、字符串会生成一个字符串指针。尽量用标准库函数对其操作。