小结

概念

■ C语言的字符串文字量,在语法上是用""括起来的若干连续的字符,在存储时在字符串最后一个字符后面加上字符'\0'。字符串文字量可以看作与之长度相等的字符数组类型,在C语言中经常使用“char *”类型的指针变量实现对字符串的操作。

■ 两个相邻的字符串字面量在编译时会被合成为一个。

■ 和字符数组赋初值不同的是:

小结 - 图1

的含义是数组赋初值是将字符'a'、'b'、'c'、'\0'写入数组所在的存储空间。而对指针p_c赋初值则只发生了一个指针赋值。

■ 字符数组在定义时赋初值有如下两种等价的方式。

小结 - 图2

■ 字符数组中必须有'\0'时才可以进行与字符串相同的操作。

■ 运行时输入字符串必须在代码中为字符串预备存储空间。通常是通过定义字符数组实现。

■ 表达式“sizeof "abc"”的值为4,函数调用表达式strlen("abc")的值为3。

■ C语言对字符串几乎所有的操作都是通过“char *”类型的指针与字符串结尾的'\0'标志相互配合完成的。

■ C99容许在形参说明符“[]”内写修饰符:“static”其后的整数表示对应数组的最小长度;“restrict”,表示所修饰的指针是对对象的唯一访问途径;“volatile”没有任何含义;“const”的含义是所修饰的指针的值不应该被改变。

■ sscanf()函数和sprintf()函数的功能与scanf()及printf()一样,但面向的是字符串而不是标准输入输出设备。

■ “restrict”,是专门用于修饰数据指针类型的限定符。它表示的含义是对于指针所指向的对象必须只能通过这个限定的指针进行读写。这个关键字对编译器、函数作者、函数调用者有不同的含义。

■ C89和C99中,main()有两种标准形式:

小结 - 图3

■ int main(int argc, char argv[]){/…*/}形式的main()可以接受运行环境传入的程序运行参数。其中“argc”为命令行参数的个数,argv为指向命令行各个参数的指针所构成的数组开始元素的指针。

■ 枚举类型是一种构造性的数据类型,本质上属于“整数类型”的一种,是“int”类型的一个“小”子集。

■ 除非特别指定,首个枚举常量的值总是0,后一个枚举常量的值总是比前一个大1。

■ 枚举类型可以极大地改善代码的可读性。

■ C语言中枚举类型与“int”,类型是相容的。

风格

■ 构造枚举数据类型时,缺省附加标识通常不是一种良好的编程风格。

■ 把较长的字符串字面量分成若干段有时可以改善代码的可读性。

常见错误

■ 修改字符串文字量中的字符是一种未定义行为。

■ 没有为运行时输入的字符串准备存储空间或备存储空间不够会造成越界。

■ 在字符数组中忘记写入结尾的'\0'却把字符数组看作字符串操作。

■ 对于“char s[80];”,“scanf("%s ",&s);”是一种概念模糊似是而非的写法。

■ 按照字符串方式输出一个不包含'\0'的字符数组。

■ 给函数的“char *”类型形参传递“char”类型实参。

■ 给函数的“char”类型形参传递“char *”类型实参。

牛角尖

■ 可以使用已定义了的枚举常量来表示另一个枚举常量的值吗?可以。例如

小结 - 图4

是完全合法的,因为枚举常量可以出现在任何容许“int”类型常量出现的地方。

■ 枚举数据类型可以出现相等的成员值吗?

可以。例如:

小结 - 图5

在任何符合C标准的编译器中都不会有什么问题。枚举的主要意义在于为有意义的一系列“int”常量命名。

■ 枚举常量可以作为switch语句中的case标号吗?

当然可以。因为枚举常量本身就是int类型的。