Algorithms + Data Structures = Programs
----Nicklaus Wirth
C中数据类型
C语言的数据被我分成了两大类,一类我称之为基本数据类型,一类是用户自定义类型。再谈类型之前,我要明确一点,说程序中所谓的量,都需要对应一段内存空间。但是,内存空间存储的仅仅是0101这种数据。C所谓的类型声明,就是对这些数据代表意义的说明。通过这种声明,告诉程序如何读取处理这些数据。说白了,类型就是对内存中存放数据结构的描述。
声明类型都是静态
C中所有在程序中声明的数据都是在程序运行前就已经被静态的写入到了程序中的,也就是说,如果你声明了5个数据,那么你就只能在程序中存放5个数据。但是,这样对于程序员来说太不方便了,于是,C中存在着3个函数(由操作系统提供malloc,calloc,ralloc),专门用于为程序在运行时申请新的内存空间,来存放数据。这是你可以存放足够多的数据而不用一一声明
用户自定义类型&基本类型
C中基本类型有4大类:char,int,float/double,POINT。char用于存放字符,int用于存放整数,float/double两种用于存放小数。POINT用于存放内存地址。各种字符所占内存空间长度也有所不同,详情间附录。C中还有用户定义的类型,这些类型通常由基本的4大类,以及其他用户定义类型组合而成。在使用用户定义类型前,必须先声明(定义)这些类型,编译器才能在内存中正确的读取这些数据
类型&操作符
不同的数据类型有着各自的操作符。比如,对于数字和字符你可以进行位操作,但是对于指针,编译器不会让你那样做。对于指针类数据,你可以用*操作符读取器指向的数据,但是对于数字与字符,*只能用来做乘法计算。对于用户定义的数组有专用的[]操作符(或者也可以叫做语法糖),对于结构我们有 . 和 ->。当然,最通用的还是取地址运算符,除了一种特殊的结构(bit)不能使用外,其他所有情况均可以取到地址,毕竟一切数据都在内存中,内存中内一个数据都有其对应的地址。
指针数据的作用
这是一个困扰了无数新手的话题。指针就是一个存储了其他数据地址的数据。通过*运算符可以返回存储地址上的数据。指针仅仅指向数据的开头地址。这也可以看出,指针是有类型的原因,要想正确的读取数据,你必须知道这个数据的结构。指针的类型信息告诉*(取地址)运算符如何正确工作
类型强制转换
之前我们说过,类型就是对内存中存放数据结构的描述。
但是,那些毕竟仅仅是一些数据,没人想被编译器控制,因而我们可以通过强制手段改变对数据读取的方式。这一特性主要用于C中动态申请内存空间后返回数据的处理,这样来告知编译器,用何种方式读取这些内存。通过强制转化,我们得到了一种非常灵活的方式来以任意方式读取数据。当然灵活的结果是编译器无法告诉你你会犯错;当然编译器也总会杞人忧天。
简述用户自定义类型
这些类型通常由基本的4大类,以及其他用户定义类型组合而成
数组:一个块内存空间爱中存放N个相同类型的数据;结构:一块内存中存放多个不同的数据;枚举:用符号代表数字;联合:使一块内存中的数据可以存放多种类型的数据,可以方便强制转化,简化代码,防止溢出
函数&数据
C中的函数是很纯洁的,总的来说是无副作用的。应为函数的传入值是被复制传入的,但是由于指针的存在,可以修改指针指向地址的值。另一方面,C的函数可以通过指针变量传递函数入口。从而使函数称为第二类值。通过这种机制,你可以向函数传递函数参数,非常有利于开发库。
Appendix
标准类型 | 所占内存空间长度 |
---|---|
char | 1 |
int | 4 |
short int | 2 |
long int | 4 |
long long int | 8 |
float | 4 |
double | 8 |
long double | 12 |
POINT | 4 |
- array
- struct
- enum
- union
- byte
您必须登录才能发表评论。