- 不能在注释内嵌套注释
空格分隔语句的各个部分,让编译器能识别语句中的元素
- 基本类型:整数类型和浮点类型
- 枚举类型:在程序中只能赋予其一定的离散整数值的变量
- void 类型:表明没有可用的值
- 派生类型:指针类型、数组类型、结构类型、共用体类型和函数类型
sizeof(type)可得到存储对象或类型的字节大小
- 变量其实就是程序可操作的存储区的名称
- 变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续编译
变量声明有两种情况:
1、需要建立存储空间。例如:int a 在声明的时候就已经建立了存储空间
2、不需要建立存储空间的,通过使用extern关键字声明变量而不定义它
例如:extern int a, 其中变量 a 可以在别的文件中定义。
C 中有两种类型的表达式:
- 左值(lvalue):指向内存位置的表达式。左值可以出现在赋值号的左边或右边
- 右值(rvalue):右值是不能对其进行赋值的表达式,右值可以出现在赋值号的右边,但不能出现在左边
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
在 C 中,定义常量的方式:
使用 #define 预处理器
使用 const 关键字
- 存储类定义 C 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前
- auto 存储类是所有局部变量默认的存储类。auto只能用在函数内,即只能修饰局部变量
- register 存储类用于定义存储在寄存器中而不是 RAM中的局部变量。不能对它应用一元的 ‘&’ 运算符(因为它没有内存位置)
- static 存储类指示编译器在程序的生命周期内保持局部变量的存在,而不是在每次进入和离开作用域时进行创建和销毁。使用 static修饰局部变量可以在函数调用之间保持局部变量的值。static 是全局变量的默认存储类
- extern 通常用于两个或多个文件共享相同的全局变量或函数的时候
&返回变量的地址
*指向一个变量。
C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false
函数声明会告诉编译器函数的名称及如何调用函数。函数的实际主体可以单独定义。
函数声明包括以下几个部分:
return_type function_name( parameter list );
在函数声明中,参数的名称并不重要,只有参数的类型是必需的:
int max(int, int);当调用函数时,有两种向函数传递参数的方式:
- 传值调用
把参数的实际值复制给函数的形式参数。在这种情况下,修改函数内的形式参数不会影响实际参数。 - 引用调用
通过指针传递,形参为指向实参地址的指针,当对形参操作时,就相当于对实参进行的操作
- 传值调用
C 语言中有三个地方可以声明变量:
在函数或块内部的局部变量
在所有函数外部的全局变量
在函数的形参定义中
局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值
当局部变量被定义时,系统不会对其进行初始化,必须自行对其初始化。定义全局变量时,系统会自动对其进行初始化:
数据类型 | 初始化默认值 |
---|---|
int | 0 |
char | ‘\0’ |
float | 0 |
double | 0 |
pointer | NULL |
声明数组double balance[10];
初始化数组double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
double balance[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
数组名是一个指向数组中第一个元素的常量指针.balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址
指针是一个变量,其值为另一个变量的地址。在使用指针存储其他变量地址之前,必须对其进行声明。声明指针变量的一般形式:
type *var-name;
type 是指针的类型,它必须是一个有效的 C 数据类型,var-name 是指针变量的名称。用来声明指针的星号 * 与乘法使用的星号相同。所有指针的值的实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的十六进制数。不同数据类型的指针所指向的变量或常量的数据类型不同。
在指针变量声明的时候,如果没有确切的地址可以赋值,可以为指针变量赋一个 NULL 值。这是一个良好的编程习惯
NULL 指针是一个定义在标准库中的值为零的常量
在大多数的操作系统上,程序不允许访问地址为 0 的内存,因为该内存是操作系统保留的。内存地址 0 有特别重要的意义,它表明该指针不指向一个可访问的内存位置。按照惯例,如果指针包含空值(零值),则假定它不指向任何东西。一个指向指针的指针变量必须如下声明,即在变量名前放置两个星号。下面声明了一个指向 int 类型指针的指针:int **var;
- 函数指针是指向函数的指针变量
int max(int x, int y)
{
return x > y ? x : y;
}
int main(void)
{
/* p 是函数指针 */
int (* p)(int, int) = & max; // &可以省略
}
- 定义指向结构体的指针
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
struct Books *struct_pointer;
struct_pointer = &Book1;
- 访问结构的成员,使用 -> 运算符:
char greeting[6] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’};
依据数组初始化规则,您可以把上面的语句写成以下语句:
char greeting[] = “Hello”;
- 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如存放一个开关量时,只有 0 和 1 两种状态,用 1 位二进位即可。为了节省存储空间,并使处理简便,C 语言提供了一种数据结构,称为”位域”或”位段”:
所谓”位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许按域名进行操作。
struct bs{
int a:8;
int b:2;
int c:6;
}data;
data 为 bs 变量,共占两个字节。其中位域 a 占 8 位,位域 b 占 2 位,位域 c 占 6 位
一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
struct bs{
unsigned a:4;
unsigned :4; /* 空域 */
unsigned b:4; /* 从下一单元开始存放 */
unsigned c:4
}
- 这个位域定义中,a 占第一字节的 4 位,后 4 位填 0 表示不使用,b 从第二字节开始,占用 4 位,c 占用 4 位。
位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。位域可以是无名位域,这时它只用来作填充或调整位置。无名的位域是不能使用的。
位域的使用和结构成员的使用相同,其一般形式为:
位域变量名.位域名
位域变量名->位域名共用体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体占用的内存应足够存储共用体中最大的成员。
union Data
{
int i;
float f;
char str[20];
} data;
C 语言提供了 typedef 关键字,使用它来为类型取一个新的名字。
- C 指令#define ,用于为各种数据类型定义别名,与 typedef 类似,但是它们有以下几点不同:
- typedef 仅限于为类型定义符号名称,#define 不仅可以为类型定义别名,也能为数值定义别名,比如您可以定义 1 为 ONE。
- typedef 是由编译器执行解释的,#define 语句是由预编译器进行处理的。
不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、Big5、Shift_JIS 等各自的编码标准。这些使用 1 至 4 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码。