"C语言数据操作"

  "C语言基础复习一"

Posted by Xu on January 2, 2018

C语言数据操作

知识导图: C_basedata

浮点型包括float,double,long double,浮点数字面值缺省情况下都是double类型的,除非后面跟一个l或L表示为long double或f或F表示float

C语言之所以受欢迎是因为指针可以有效实现诸如tree或list这类高级数据结构。

指针常量和非指针常量本质上是有区别的,非指针常量的值是确定的,一旦赋值后不可更改,而指针常量是一个指向变量或常量的指针,一旦赋值也不能更改,但是它的值是可能变化的,因为一个变量在程序加载的过程地址是不确定的。

声明方式:int *const point = &a;

字符串常量:在C语言的概念中没有字符串常量,但存在字符串概念:一串以NUL结尾的字符数组。字符串常量是不能直接赋值给字符数组的,因为字符串常量通常表示为一个“指向首字符的指针”,所以需要复制或赋值字符串需要用到操作字符串的函数:复制,连接,比较,计算字符串长度,查找指定字符等

声明

指针: int* a,b,c; //这个声明只有a是指针变量,b,c为int整型值。

typedef

用于创建新的类型名:typedef char* new_typename; #define也可以用于创建新的类型名,但它实质是copy了字符串:

如#define newchar char*;
newchar a,b;//相当于char* a,b;只有a被定义为字符指针,b为字符

作用域:内层代码块中的标识符和外部标识符重名时,内层标识符会隐藏外层标识符。

链接属性:

  • external :具有该属性的标识符无论声明多少次,位于几个源文件都表示同一个实体
  • internal :在同一源文件中的所有声明都指向同一实体,位于不同源文件属于不同实体。
  • none :没有链接属性的标识符,多个声明当成多个不同的实体

external在第一次声明一个标志符时可指定该标志符的链接属性,但第二次声明使用在该标志符时则不会改变该标志符的链接属性,而是用于引用其它源文件的该external属性的变量,当代码块内部引用本源文件前面已经定义的external属性的变量时,使用external声明并不是必须,只有引用其它源文件定义的external属性的变量时,必须使用external声明:

static int i;//i的第一次声明 int func() { external int k;//第一次使用external修改k的链接属性 external int i;//external用于i的第二次声明,不会修改i的链接属性而是告诉使用其它作用域的i变量 }

若某个声明在正常情况下具有external属性,使用static关键字可以将它的链接属性改为internal,若static修饰none属性的变量,修改的是存储属性而非链接属性:

如:static int a;(int a的声明是在所有代码块以外,缺省具有external属性)

或函数 static int funa(int b)(函数名一般都具有external属性,加static声明后,该函数只被这个源文件私有)

存储类型:

变量的存储类型决定变量何时创建何时销毁,以及它的值将保持多久。三个地方用于保存变量:普通内存,运行时堆栈,硬件寄存器。

变量的缺省存储类型取决于它的声明位置:

  • static:凡是在任何代码块之外声明的变量都存储于静态内存中,也就是不属于堆栈的内存,这类变量称为静态(static)变量。静态变量在运行之前创建,在程序整个执行期间都存在,它始终保持原先的值,除非赋给它不同的值。
  • auto:在代码块内部声明的变量缺省存储类型为自动的(automatic),存储于堆栈中,在代码块执行完毕后消失
  • register:用于声明寄存器变量,也是一种自动变量只不过存放在硬件寄存器中,访问起来效率更高,至于如何使用寄存器由编译器决定

初始化

  • 自动变量的初始化需要更多的开销,因为程序链接时还无法判断自动变量的存储位置,而静态变量的存储位置已经在链接前确定。

  • 同时自动变量的显示初始化和赋值初始化没有效率上的差别,因为显示初始化包含一条隐式赋值语句。

  • 所以任何自动变量声明后没有进行初始化,那么它的值是垃圾,而静态变量会有缺省的初始化值。

static

由上面部分内容可看出static字段用在不同的上下文环境有着不同的作用:

  • 用在代码块之外的变量声明及函数定义时,用于修改标识符的链接属性,从external改为internal
  • 用在代码块内部的变量声明时,用于修改变量的存储类型,由自动变量改为静态变量