C与指针第三章——数据

一.基本数据类型

四种基本类型,整型,浮点型,指针,聚合类型

九种类型char,signed char,unsigne char,short int,unsigned  short int,int,unsigned int,long int,unsigned long int。

1.1整型

包括字符(小整型值),短整型,长整型,都分为signed和unsigned.

长整型至少应该和整型一样长,整型至少和短整型一样长,以解决环境之间的移植问题。

整型字面值(literal),一种实体,指定了自身的值,并且不允许发生改变,也可以说是常量

命名常量(named constant,声明为const的变量),与普通变量类似,被初始化,值不能改变。

字符常量,类型为int

枚举:它的值为符号常量而不是字面值常量

1.2浮点类型

1.3指针

指针常量(pointer constant)

当一个函数被调用时,它的局部变量可能每次分配的内存位置都不同。

字符串常量(string literal)

字符串就是以NUL字节结尾的零个或多个字符,即使时空字符串,依然以NUL结尾。

不要修改存储于内存中的字符串常量,这会殃及其他字符串常量,将要修改的字符串常量存储于数组中。在使用字符串常量时往往使用的是指向字符串常量的指针,指向字符所存储的地址。

二.基本声明

声明变量的基本形式

说明符 (一个或多个) 声明表达式列表

初始化

声明指针时,星号“”要靠近变量名

考虑一个例子就明白了

int  *a,*b,*c;

 

三.typedef(为数据类型定义新的名字)

四.常量(const

int const a;

const int a;

常量和变量完全一样,只是值不能改变,无法赋值任何东西。一开始拥有一个值的方法是初始化和在函数中声明为const的形参在函数调用时会得到实参的值

区分下面这些声明的不同,关键点可以理解为以*为界,前面一部分时指针所指向的值,后面一部分指针(地址),谁离const近,谁就是常量(即不能改变)

int  *pi;                                                 一个普通的指向整型的指针变量

int   const   *pi                                   一个指向整型常量的指针,可以修改指针的值,不能修改所指向的值

int   *const   pi                                   一个指向整型的常量指针,可以修改所指向的值,但不能修改指针的值

int    const   *const    pi                     一个指向整型常量的常量指针,不能修改所指向的值,也不能修改指针的值

另一种创建名字常量的机制是#define

 

五.作用域

 

编译器确认四种作用域:文件作用域,函数作用域,代码块作用域,原型作用域

六.链接属性(局部变量不具有链接属性)

一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或者多个函数库中引用的函数链接在一起,形成可执行程序。有相同的标识符出现在几个不同的源文件中,标识符的链接属性决定如何处理不同文件中出现的标识符。标识符的作用域与链接属性有关,但两个属性并不相同。

链接属性有三个:external(外部),internal(内部),none(无)

属于none的标识符被当作单独的个体,该标识符的多个声明被当作独立不同的实体

属于internal的标识符在同一个源文件的所有声明指向一个实体,位于不同源文件的声明指向不同实体

属于external的标识符声明指向同一个实体

 

关键字extern和static用于在声明中修改标识符的链接属性(只对缺省属性为external的声明有用),如果某个属性在正常情况下居具有external 的链接属性,在前面加上static使它的链接属性变为static

static int a;                    表示变量b为这个源文件私有

static  int c(int b)     表示这个函数不能被其他文件调用

如何局部变量被声明为extern,它将具有erternal属性,存储于静态内存,属于全局变量。

五.存储类型(存储变量值的内存类型)

何时创建,何时销毁,生命期

三个地方存储变量:普通内存,运行时堆栈,硬件寄存器

变量不会总声明它的存储位置,其缺省的存储类型取决于声明的位置;代码块之外的变量声明存储于静态内存,属于静态变量,  

程序运行前建立,程序的执行期始终存在。

在代码块中的变量默认声明为自动(automatic),存储于堆栈。在程序声明到自动变量的代码块时,创建,离开该代码块时,销毁。当代码块被再次执行时,自动变量在堆栈中占据的内存位置随机,所以再次使用的代码块的自动变量并不是上一次的值了(人不能踏入同一条河流)

自动变量加上关键字static,就变为静态,延长了生命期,但没有改变作用域。所以函数的形参不能声明为static,因为实参在堆栈中传递给函数。

register声明自动变量,称为寄存器变量,把使用频率高的变量声明为自动变量,提高效率(如何做)

寄存器变量的额外工作,使用寄存器变量的函数返回之前,先前存储的值必须恢复,确保调用者的寄存器未破坏

初始化:

静态变量的初始化在程序执行时使用的位置(开销小),初始化一次,缺省为0;

自动变量无法确定位置,没有缺省,需要显示初始化:四种后果:声明同时初始化和先声明后初始化没有效率只差;每次执行到声明函数时将重新初始化;用任何表达式作为初始化值,提高代码效率;未初始化时垃圾

对于函数而言,存储才静态内存中。

六.static关键字(在不同的上下文,static关键字有不同的意思)

情况1:用于函数定义或者代码块之外的变量声明时,static 关键字用于修改标识符的链接属性,从external改为internal,存储类型和作用域不受影响;

情况2:用于代码块内部的变量声明时,static关键字用于修改变量的存储类型,从自动变量改为静态变量,但变量的链接属性和作用域不受影响

猜你喜欢

转载自blog.csdn.net/weixin_41080288/article/details/84964298