数据类型以及变量与常量

来源:互联网 发布:linux中cat命令语法 编辑:程序博客网 时间:2024/04/27 21:26

一.数据类型

①什么是数据类型

数据集合的划分,不同数据类型对CPU的意义不一样

数据类型分基本数据类型和复合数据类型,

复合数据类型包括 数组,结构,联合,枚举,指针

基本数据类型包括 空类型,字符型,数值型

而数值型又包括实型(单精度实型,双精度实型),整型(短整型,整型,长整型\\\细分分有无符号)

②如何定义变量(左右法则)

C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可以说是相反的。右左法则的英文原文是这样说的:

The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed

右左法则:首先从最里面的圆括号内未定义的标识符开始阅读看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。
  总之对声明进行分析,最根本的方法还是按优先级和结合性来类比替换,从那些最基本的声明进行类比,简化,从而进行理解接下来我将举出一系列例题来具体理解。

1. int a ;a:整型变量

 2. int *a ;      a:整型指针变量

3. int **a ;a:整型指针的指针变量

4. int a[10] ;  a:整型数组

5. int *a[10] ;    a:整型指针数组

6. int (*a)[10] ;   a:整型数组指针变量

7. int (*a)(int) ;    a:函数指针变量(形参类型int,返回值类型int

8. int (*a[10])(int) ;   a:函数指针数组

9. int * (* (*fp1) (int) )[10] ;  fp1:函数指针变量,该函数指针指向一个形参为int,返回值为数组指针的函数,该数组指针指向一个整型指针数组(或者这样理解 声明了一个叫fp1的指针,指向一个参数为(int)的函数,这个函数的返回值也是一个指针,指向一个数组,这个数组里存放了(int *)类型的值 )

10. int * (* (*arr[5]) ( ) ) ( ) ;   arr:函数指针数组,该数组的元素指向一个形参为空,返回值为函数指针的函数,该函数指针指向一个形参为空,返回值为int的函数

11. float (* (*b ( ) )[ ] ) ( ) ;  b:函数,形参为空,返回值为数组指针,该指针指向一个函数指针数组,该数组的元素指向一个形参为空,返回值为float的函数

12. void *( *c )(char,int( * )( ) ) ; c:是一个函数指针变量。该函数是一个形参为char,另一形参为 形参为空返回值为int型的函数指针变量且返回值为void的函数。



③字节长度

bit   字节=8bit半字=2个字节=16bit=4个字节=32bit

sizeof() 为一个运算符  测量数据类型 如sizeof(int)

32位系统下int short long float double char

                  4   2   4    4   8    1

32位系统下 指针类型都为4个字节(地址长度固定,由操作系统决定)

④取值范围

目前,主流编译环境都是32位,32位平台下各种数据类型取值范围:

整型[signed]int -2147483648~+2147483648

无符号整型unsigned[int] 0~4294967295

短整型short [int] -32768~32768

无符号短整型unsigned short[int] 0~65535

长整型Long int -2147483648~+2147483648

无符号长整型unsigned [int] 0~4294967295

字符型[signed] char -128~+127

无符号字符型unsigned char 0~255

单精度float 3.4 x 10^-38~ 3.4 x 10^+38

双精度double 1.7 x 10^-308~ 1.7 x 10^+308

长双精度long double 1.7 x 10^-308~ 1.7 x 10^+308

⑤符号与无符号

有符号数和无符号数进行比较运算时(==<,> ,<=,>=)有符号数隐式转换成了无符号数(即底层的补码不变,但是此数从有符号数变成了无符号数)

⑥强制类型转换

char < int <float<double (隐式类型转换)  在类型不兼容时才需强制类型转换。

二.变量与常量

①什么是变量,变量的特点

变量即在程序运行过程中它的值是允许改变的量。

变量的三大特点:

1.变量的数据类型:主要说明变量占用内存空间大小 ,如int型。

2.变量的作用域:变量的有效性的范围,即变量的使用范围

3.变量的存储类型:变量在内存中的存储方式。不同的存储方式,影响变量在内存中的生存周期

②声明与定义

定义:创建一个变量,为其分配内存空间,并为它取名(变量名),一个变量只能定义一次;

声明:告知编译器,这个名字(变量名)已经匹配在一块内存上了,但是并未为其分配内存;

-------------------------------

变量的声明有两种情况:

定义性声明:需要建立存储空间,如int a在声明的时候就已经建立了存储空间。

引用性声明:不需要建立存储空间,如extern int a 其中变量a是在别的文件中定义的。

③全局变量与局部变量的区别

1.存放位置     

局部变量存放于栈空间,全局变量存放在 数据段的data(静态数据区)区域

2.赋值

   当我们定义变量时,如果定义为全局变量,系统会自动把变量初始化为默认值(内置类型初始化为系统默认值,自定义类型调用相应的初始化函数进行初始化),而定义为局部变量时,系统不会自动初始化变量,我们必须手动对变量进行初始化(无论是内置类型还是自定义类型),否则得到的结果可能和我们预期的不一致,甚至导致程序出错

3.何时释放

全局变量:在编译时分配,在main结束时释放;

局部变量、形参:在函数调用时分配,在函数返回时释放

4.作用域

全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。

静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。

局部变量也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回。  

静态全局变量也具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同的静态全局变量,他们也是不同的变量。

 

 ④变量的存储区域的划分

内核

栈空间

堆空间

数据段

代码段

 

栈空间:局部变量,函数形参,自动变量

堆空间:malloc ralloc calloc分配空间

数据段分为bbs,rodata,databss:保存未初始化的全局变量

  rodata:常量

  data(静态数据区):全局变量,static修饰变量

数据段代码段 即数据区

栈空间特点:先进后出,管理权限:系统

堆空间特点:先进先出,管理权限:用户

0 0
原创粉丝点击