一、C的数据类型
1.什么是数据类型
2.各数据类型的字节长度和指针变量的字节长度
3.变量及变量的特点
4.右左法则及举例
5.sizeof()和strlen()
一.C的数据类型
1.什么是数据类型
数据类型就是数据集合的划分,不同的数据类型对CPU具有不一样的意义,所以一定要注意相应变量数据类型的定义和转换。 数据类型又划分为两大类:基本数据类型和复合数据类型。
●复合数据类型包括 数组,结构,联合,枚举,指针
●基本数据类型包括 空类型,字符型,数值型
●而数值型又包括实型(单精度实型,双精度实型),整型(短整型,整型,长整型)
2.各数据类型的字节长度和指针变量的字节长度
2.1.在不同的编译系统中,编译系统对各数据类型分配字节数可能不同,对此我们在编写程序前必须对所用的编译系统有相关的了解。例如在gcc编译中各数据类型字节长度为:
int:4个字节;short:2个字节;long:4个字节:char:1个字节;float:4个字节
2.2指针的字节长度:通常指针的字节长度都是固定的,且长度有操作系统所决定。指针中存放的元素为地址,而不同的操作系统有其固定的地址长度,因而指针的字节长度也就固定。例如:
3.变量及变量的特点
3.1什么是变量
在其值的作用域内可以改变的量称为变量。一个变量应该有一个名字,在内存占据一定的存储空间。
3.2变量的三大特点:
●变量的数据类型:主要说明变量占用内存空间的大小如int型。
●变量的作用域:变量的有效性的范围。
●变量的存储类型:变量在内存中的存储方式。不同的存储方式影响变量在内存的生存周期。
3.3变量的声明和定义
定义:创建一个变量,为其分配内存空间,并为它取变量名,一个变量只能定义一次。
声明:告知编译器这个变量名已经匹配在一块内存上了,但是并未为其分配内存。
3.4变量声明和定义的两种情况:
●定义性声明:需要建立存储空间。例如:int a在声明时就已经建立了存储空间。
●引用性声明:不需要建立存储空间。例如:extern int a其中变量a是在别的文件中定义的。
3.5变量的存储区域的划分
①栈空间:局部变量,函数形参,自动变量
②堆空间:malloc ralloc calloc 分配空间
③ 数据段分为bbs,rodata,data。
●bss:保存未初始化的全局变量
●rodata:常量
●data(静态数据区):全局变量,static修饰变量
④数据段代码段 即数据区
栈空间特点:先进后出,管理权限:系统
堆空间特点:先进先出,管理权限:用户
3.6
●全局变量与局部变量的区别
①存放位置
局部变量存放于栈空间,全局变量存放在 数据段的data(静态数据区)区域
②赋值
当我们定义变量时,如果定义为全局变量,系统会自动把变量初始化为默认值(内置类型初始化为系统默认值,自定义类型调用相应的初始化函数进行初始化),而定义为局部变量时,系统不会自动初始化变量,我们必须手动对变量进行初始化(无论是内置类型还是自定义类型),否则得到的结果可能和我们预期的不一致,甚至导致程序出错
③何时释放
全局变量:在编译时分配,在main结束时释放;
局部变量、形参:在函数调用时分配,在函数返回时释放
④作用域
●全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。
●静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
●局部变量也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回。
●静态全局变量也具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同的静态全局变量,他们也是不同的变量。
4.右左法则及举例
4.1.右左法则:从最内部的括号(变量)开始阅读声明,先向右看,再向左看,碰到一个括号时调转阅读方向,括号内的内容阅读完毕则跳出括号。直到全部阅读结束为止。例如:
(1)int a; a 整型变量
(2)int *a; p 整型指针变量
(3)int **a; p指针变量p,p指向另一指针,另一指针指向整型数
(4)int *a[10]; a是有十个元素的数组,里面存放着指针变量,这些指针指向整型(整型指针数组)
(5)char (*a)(int); a是一个指针变量,它指向一个形参为int型,返回值为char型的函数(char型函数指针变量)
(6)int (*a[10])(int); a是一个指针数组,该指针指向一个形参为int型,返回值为int型的函数
(7)int *(* (*fp) (int))[10];fp是一个函数指针变量,该函数是一个形参为int型,返回值为数组指针的函数,该数组指针指 向整型指针
(8)void *(*c)(char ,int (*)());c是一个函数指针变量。该函数是一个形参为char,另一形参为形参为空返回值为int型的函 数指针变量且返回值为void的函数。
5.sizeof()和strlen()
5.1.sizeof(): sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。切记sizeof()是一个运算符而不是一个函数。例如:
sizeof()在对变量的存储大小进行计算时sizeof()可不加上括号,sizeof()在对数据类型的存储大小进行计算时sizeof()不能省略括号。
5.2.strlen():从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0'),实质上是一个C函数。