C语言知识点总结,全程干货---1数据类型

     最近由于工作的原因,需要重新学习一下C语言,因此,如果有一定的基础,但是想要更全面的了解C语言,那这篇文章对于你来讲一定值得一看。C的内容广泛而深刻,并且处处都有细节,所以这次的学习之旅不会只有这一篇文章,而是一个系列,每个系列都代表一块内容,因此,本篇文章也是这个系列的第一篇文章,学习之旅就此开始吧!


数据类型

C的数据类型简单理解的话可以分为两类: 1.基础类型    2.在基础类型之上延伸出的类型

基础类型:整型,浮点型,字符型,布尔型,(还有复数类型,虚数类型,不过很少使用)

延伸类型:结构体,枚举,共用体(联合体), 

提起数据类型,必须要关注三个点:关键字,大小,存储方式,关键字是为了定义数据类型,大小和存储方式都是为了了解计算机存储和使用数据的底层逻辑,以便更好的使用。

基础类型

整型 int   

整形(int)都是以二进制方式存储。

int  一般为4个字节,但是在不同位操作系统环境下可能会有不同,比如:在16位中2个字节,32位中4个字节,64位中4个字节。

short  一般为4个字节,C中规定short的字长不大于int的字长。

long  一般为4个字节,C中规定long的字长不小于int的字长。

long long 一般为8个字节,C中规定long long的字长不小于long的字长。

整形一般为以上4种,再加上unsigned关键字,可以扩充为8种,unsigned意为无符号,添加在整形关键字的前面,如果不加unsigned,则默认为signed,即有符号,无符号将存储符号的那个位也拿来存储数据,因此正数范围要比signed的正数范围大一倍。

整型定义方式和使用方式比较简单,这里不再详述。

字符型 char

char 以整型的方式存储,大小为一个字节,即8位,范围为-128--127,可以表示127个字符。字符型是和ASCⅡ编码相对应的,正好可以表示ASCⅡ编码中的128个字符。

char类型还可以定义为unsigned char,可表示范围为:0-255,可以表示扩充以后的ASCⅡ编码。

ASCⅡ编码这里就不再列出了。

/* 后来,由于计算机在全世界的普及,ASCⅡ编码远远不能满足人们对字符的需求,比如,中国的汉字,希腊字符,韩语,日语等,因此,需要创建一个能表示世界范围内多种字符的字符集,Unicode码应运而生,意为“商用统一码”,其目的是将全世界所有的字符包含在一个集合里,其存储大小可以分为17个平面,每个平面存储2^16个字符,也就是说,整个Unicode字符集的大小为1114112(2^21)个。Unicode的编码方式有UTF-8,UTF-16,UTF-32,不同的编码方式混用会导致乱码,因此,如果打开一个文本文档显示了乱码,不妨换一种编码方式试试。*/

浮点型 float  double  long double

浮点型存储方式和整形不同,其采用分块存储的方式,分为符号、指数、尾数三部分,符号部分占1位,指数部分和尾数部分根据类型不同占据不同的位。

float型总长度为4个字节,指数部分占8位,尾数部分占23位,因此其精度可以表示6~7位有效数字,可表示范围为 −3.4∗10^38--+3.4∗10^38   

double型总长度为8个字节,指数部分占11位,尾数部分占56位,其精度可以表示15~16位有效数字,(有些系统将double多出的32位全部分给尾数部分,以增大精度)。

long double型长度不小于double型,精度和范围也不小于double型(不常用,如果double达不到所要求的精度和范围,可以尝试一下long double)

浮点型的表示方法:浮点型数据可以用小数形式,也可以用指数形式,其基本形式是有符号的数字(包括小数点)后面紧跟E或e,后面跟一个有符号的数表示10的指数,例如:-1.56e+12,2.87e-3。但是其真正的写法千变万化,如何保证写法是正确的呢?主要需要注意两个点:1.符号可以省略;小数点(或小数部分)和指数符号(或指数部分)可以省略,但小数点和指数符号两者不能同时省略。2.如果有指数符号,则指数符号后必须要有数字。

由于浮点型 float  double  long double三种类型的存储和运算方式不同,所以如果在指定类型或运算的时候将它们混淆,程序不会报错,编译系统将自动进行类型转换,但很容易出现错误的结果,在使用时要特别注意这一点。

布尔型 _Bool

布尔型只有两个布尔值,true和false,C中用非0表示true,用0表示false,其存储方式以无符号的int型存储。

延伸类型

结构体 struct

基本定义方式:

关键字  结构体名                         struct   name

{                                                   {

成员1;                                         int a;

成员2;                                         float b;

...............                                       ...................

}变量名;                                      }variation;

基本定义方式中,结构体名和变量名可以省略,可以先定义结构体的结构,之后在定义变量。

结构体的存储方式是按块存储的,计算机会给结构体分配一块内存,结构体成员按照顺序依次存储在这个块中,只要知道了结构体的起始指针,就能够访问整个结构体,因此结构体经常配合指针来使用,工程中经常使用这种方法。

结构体的初始化

1.在花括号中分别输入成员值,中间用“,”隔开,系统会按照顺序依次将值赋给各个成员,如果某成员值为空,则改成员可为任何值。

{

    12,

    zhangsan,

};

2.使用“·”运算符和结构体成员进行赋值。

{

.a=12,

.b=2.1,

};

结构体引用

结构体引用有两种方式,可以用结构体成员运算符——点(.),其优先级高于“&”,或者用指向符(间接成员运算符)"->",指向符和取地址符(&)可以算得上是一对互逆的符号(取内容符”*“和取地址符”&“也是一对互逆的符号),使用指针引用结构体时只能用指向符(->)不能用成员符(.)。

枚举类型  enum

enum类型的声明方式和结构体类似,不过enum中的成员不需要指定类型,因为所有成员默认为int型,所以只要能使用int型的地方就能够使用enum类型。

enum类型的存储方式和结构体类似,不过enum很少使用指针去引用,使用enum类型是为了提高程序的可读性,它和宏定义#define类似,不过enum能更方便的一次定义多个数据,因此在相似的数据组中经常使用。

定义方式和初始化方式

enum    name  { member1,member2,member3,member4,......}variation;

enum     name { member1=100,member2=200,member3=300,member4=400,......};

如果不赋初始值,系统将自动分配默认值,成员的值将默认从0开始,依次赋值为0,1,2,3,...........;系统会将后一个成员的值赋值为前一个成员的值加1,如果给部分成员赋值,则剩余未赋值的成员依然按照这个规则赋值。

此外,enum定义好后,其中的成员可以作为int型使用,赋给任意可以接受int的变量,其成员的引用和使用方式也和int型相同;

共用体(联合体)union

union  name

{

      int  member1;

      char  member2;

      double  member3;

}variation;

共用体union的声明,初始化方式和结构体相同,存储方式也和结构体相似,不同的是系统不会给union的所有成员都分配存储空间,只会给union分配一块成员中占用空间最大的一块空间,因此union中只能够存储一个成员的值,每次也只能使用一个成员的值,多次给成员赋值时,新赋的值会覆盖掉之前的值,这是union最大的特点,使用时要注意。

union的使用:定义一个union相当于定义了一个任何类型的结构,我们可以利用任何一个成员名来访问和改变union变量的值;其次,我们可以设置一个切换开关,比如设置一个statue,根据statue的值为1,2,3....来选择使用union中的成员1,成员2,成员3.....,而不用去反复定义多个不同的变量。

union成员的值可以是任何类型,这与enum不同。

以上介绍了数据的类型,定义方式,用法,存储方式以及注意事项,但是关于变量还有必须要注意的一个点,即变量的作用域和存储类别。

变量的作用域和存储类别

按变量的作用域可以将变量分为:全局变量和局部变量;

按变量的存储类别可以分为:静态变量,动态变量,寄存器变量;

全局变量一般定义在函数的外部,其作于域为从定义开始,到程序末尾,系统为其分配固定存储空间,如果要扩展其作用域,或者在其它文件中也使用这个变量,用关键字“extren”进行声明(注意extern只是扩展声明,并不是定义外部变量的关键字,用普通的变量定义方法在函数外部定义变量时,此变量就默认为外部变量了)。

但是全局变量是有副作用的。

1.它破坏了函数的封装性,不能实现信息隐藏,谁都可以改写它,很难确定谁改写了它。
2.依赖全局变量的函数很难在其他程序中复用,依赖全局变量的函数不是“独立”的。
3.对于使用全局变量的程序,维护起来比较困难。
所以全局变量不常用,多用函数返回值和形参来代替。

局部变量为定义在函数内部或者语句块内部的变量,只在其定义的函数或语句块中有效,在其它地方不能使用,程序为其分配动态存储空间,程序或语句块执行完毕即释放其存储空间,我们在编程中使用的大部分都是局部变量。

可以使用static将局部变量声明为静态存储类型,这样就可以使函数或语句块执行完毕后保留变量的存储空间,即保留变量值,以便下次使用。

静态变量:关键字为:static,变量被声明为静态变量后,系统为其分配静态存储空间,在整个程序运行期间都不释放,变量在函数调用结束后不消失而保留原始值,静态变量赋初值时只赋一次初值,如果不赋初值,编译器自动赋初值为0。全局变量存储在静态存储区。

动态变量:关键字:auto,如果不指定变量的存储类别,则默认为动态存储变量,系统为其分配动态存储空间,调用后即释放其存储空间,变量不能保留其原始值。局部变量存储在动态存储区。

寄存器变量:关键字:register,系统在寄存器中为其分配存储空间,对于需要频繁调用的值,可以声明为寄存器变量,以提高程序运行效率。

持续更新中..................

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值