分类 编程语言 下的文章

与文件通信

  1. 文件是什么
    文件通常是在磁盘或固态硬盘上的一段已命名存储区。C把文件看作是一系列连续的字节,每个字节都能被单独读取。由于某些环境中可能无法完全对应这个模型,C提供两种文件模式:文本模式二进制模式
  2. 文本模式和二进制模式
    首先要区分文本内容二进制内容文本文件格式二进制格式、以及文件的文本模式二进制模式

    • 所有文件的内容都以二进制形式(0或1)存储。

      • 如果文件最初使用二进制编码的字符(如ASCII或Unicode)表示文本;该文件是文本文件,其中包含文本内容
      • 如果文件中的二进制值代表机器语言代码或数值数据或图片或音乐编码,该文件就是二进制文件,其中包含二进制内容
    • Unix用同一种文件格式(文本和二进制是同一种格式)处理文本文件和二进制文件的内容。

      • C和Unix在文本中都使用\n(换行符)表示换行,程序可使用Unix目录中统计文件大小的计数来确定是否读到文件结尾;
      • OS X Macintosh文件用\r(回车符)表示新的一行;
      • MS-DOS文件用\r\n组合表示新的一行,用嵌入的Ctrl+Z字符表示文件结尾。
    • C提供两种访问文件的途径:二进制模式文本模式

      • 在二进制模式中,程序可以访问文件的每个字节。
      • 在文本模式中,程序所见的内容和文件的实际内容不同。程序会在读取文件时将本地环境的模式转换成C模式以便处理(如上面的换行标识符),反之写入文件时会将C模式转换回本地环境的模式。除了文本模式还能以二进制模式读写文本文件,其不会发生上述转换,显示文件实际内容。


- 阅读剩余部分 -

存储类别

C提供了多种不同的模型或存储类别在内存中存储数据:

  • 从硬件方面看,被存储的每个值都占用一定的物理内存,C语言把这样的一块内存称为对象
  • 从软件方面看,程序需要一种方法访问对象。这可以通过声明变量来完成,变量名就是标识符,标识符可以用来指定特定对象的内容。标识符即是软件(即C程序)指定硬件内存的对象的方式。
  • 变量名不是指定对象的唯一途径,例如指针也同样可以指定对象(这里是说解引用的指针,指针本身指定的是一个存储地址的对象)。
  • 一般而言,那些指定对象的表达式被称为左值。所有示例表明,如果可以使用左值改变对象中的值,该左值就是一个可修改的左值
  • 数组是对象,数组的每个元素也是对象。
  • 可以用存储期描述对象,所谓存储期是指对象在内存中保留了多长时间。
  • 标识符用于访问对象,可以用作用域链接描述标识符,标识符的作用域和链接表明了程序的哪些部分可以使用它。
  • 不同的存储类别具有不同的存储期、作用域和链接。

- 阅读剩余部分 -

表示字符串和字符串I/O

在程序中定义字符串

  1. 字符串字面量(字符串常量)

    • 用双引号括起来的内容称为字符串字面量,也叫作字符串常量。双引号中的字符和编译器自动加入末尾的\0字符,都作为字符串存储在内存中。
    • 从ANSI C标准起,如果字符串字面量之间没有间隔,或者用空白字符分割,C会将其视为串联起来的字符串字面量。
    • 字符串常量属于静态存储类别,这说明如果在函数中使用字符串常量,该字符串只会被存储一次,在整个程序的生命周期内存在,即使函数被调用多次。用双引号括起来的内容被视为指向该字符串存储位置的指针。这类似于把数组名作为指向数组位置的指针。
  2. 字符串数组和初始化
    定义字符串数组时,必须让编译器知道需要多少空间:

    1. 一种方法是用足够空间的数组存储字符串。在指定数组大小时,要确保数组元素个数至少比字符串长度多1(为了容纳空字符)。所有未被使用的元素都被自动初始化为0(这里的0指的是char形式的空字符,不是数字字符0)。
    2. 另一种方法就是让编译器确定数组大小,即前面讲过的省略数组初始化声明中的大小,编译器会自动计算数组大小。让编译器计算数组的大小只能用在初始化数组时。如果创建一个稍后再填充的数组,就必须在声明时指定大小。
    3. 同数组,字符串的声明可以使用数组表示法和指针表示法。


- 阅读剩余部分 -

数组

  1. 初始化数组

    • 只存储单个值的变量有时也称为标量变量,而存储多个值的数组,C使用新的语法来初始化数组,如下:

      int main(void)
      {
          int powers[8] = {1,2,4,6,8,16,32,64}; /* 从ANSI C开始支持这种初始化 */
      }

    如上所示,用以逗号分隔的值列表(用花括号括起来)来初始化数组,各值之间用逗号分隔。在逗号和值之间可以使用空格。

    • 注意,通常的做法是用符号常量事先声明好数组的大小,以后修改数组大小只需要修改符号常量即可
    • 同普通变量一样,使用const声明和初始化数组可以把数组设为只读。
    • 同普通变量一样,在使用数组钱,必须先给他们初始化赋值,否则编译器使用的值是内存相应位置上现有的值,是不确定的。
    • 当初始化列表中的值少于数组元素个数时,编译器会把剩余的元素都初始化为0(注意,上面提到的是完全没有初始化,这里是初始化了部分);当初始化列表中的值多于数组元素个数时,编译器会将其视为错误,其实,可以省略方括号中的数字,让编译器自动匹配数组大小和初始化列表中的项数。
    • 当使用sizeof对数组求值时(sizeof运算符给出它的运算对象的大小,以字节为单位),结果是整个数组的大小(以字节为单位),可以用sizeof对数组单个元素求值(以字节为单位),整个数组大小除以单个元素大小就是数组元素的个数。

- 阅读剩余部分 -

复习函数

  • 什么是函数:函数是完成特定任务的独立程序代码单元。
  • 为什么要使用函数:

    1. 使用函数可以省去编写重复代码的苦差。
    2. 即使程序只完成某项任务一次,也值得使用函数。因为函数让程序更加模块化,从而提高了程序代码的可读性,更方便后期修改、完善。
  • 使用函数
    要使用一个函数需要使用3次该函数标识符:函数原型告诉编译器函数的类型;函数调用表明执行函数;函数定义明确地指定了函数要做什么。
  • 函数参数

    1. 定义带形式参数的函数
      函数定义中的形式参数(形参)是局部变量,属该函数私有。
    2. 声明带形式参数函数的原型
      函数声明中形参写法与函数定义基本一致,但声明可以省略形参变量名只写变量类型。
    3. 调用带实际参数的函数
      在函数调用中,实际参数(实参)提供了形参的值。

简而言之,形参是被调函数中的变量,实参是主调函数赋给被调函数的具体值。





- 阅读剩余部分 -