快捷搜索:  汽车  科技

C语言权威版学习书(C语言笔记)

C语言权威版学习书(C语言笔记)⑥允许直接访问物理地址,能进行位(bit)操作,可以直接对硬件操作。 ⑤语法限制不太严格,程序设计自由度大。 ②运算符丰富,公有34种运算符。 ③数据结构丰富,数据类型有:整型、实型、字符型、数组、指针、结构体、共用体等。 ④具有结构化的控制语句(如if…else、while、do…while、switch、for)

C语言权威版学习书(C语言笔记)(1)

准备好了吗......我开始啦

第一章 概述

1. C语言的特点

①语言简洁、紧凑,使用方便、灵活。共有32个关键字,9种控制语句。

②运算符丰富,公有34种运算符。

③数据结构丰富,数据类型有:整型、实型、字符型、数组、指针、结构体、共用体等。

④具有结构化的控制语句(如if…else、while、do…while、switch、for)

⑤语法限制不太严格,程序设计自由度大。

⑥允许直接访问物理地址,能进行位(bit)操作,可以直接对硬件操作。

⑦生成目标代码质量高,程序执行效率高。

中场休息时间!

第六章 数组

1. 一维数组

c规定只有静态存储(static)和外部存储(extern)数组才能初始化。给数组初始化时可以不指定数组长度。

2. 二维数组

3. 字符数组

部分字符串处理函数

puts(字符数组) 将一个字符串输出到终端。

gets(字符数组) 从终端输入一个字符串到字符数组,并且得到一个函数值,为该字符数组的首地址

strcat(字符数组1 字符数组2) 连接两个字符数组中的字符串,数组1必须足够大。

Strcpy(字符数组1 字符串2)  将字符串2拷贝到字符数组1中。

Strcmp(字符串1 字符串2) 比较字符串,相等返回0,字符串1>字符串2,返回正数,小于返回负数。

Strlen(字符数组) 求字符串长度。

Strlwr( 字符串) 将字符串中的大写字母转换成小写

Strupr( 字符串)  将字符串中的小写字母转换成大写

以上是一些比较常用的字符串处理函数。

第七章 函数

1. 关于形参和实参的说明

① 在函数被调用之前,形参不占内存

② 实参可以是常量、变量或表达式

③ 必须指定形参的类型

④ 实参与形参类型应一致

⑤ 实参对形参的数据传递是"值传递",即单向传递

2. 函数返回值

如果想让函数返回一个值,在函数中就要用return语句来获得,在定义函数时也要对函数值指定类型,如果不指定,默认返回整型。

3. 函数调用

1)注意在函数调用时实参和形参的个数、类型应一一对应。对实参表求值的顺序是不确定的,有的系统按自左至右,有的系统则按自右至左的顺序。这一点要注意。

2)函数调用的方式:函数语句,函数表达式,函数参数

3)如果主调函数和被调函数在同一文件中,并且主调函数在前,那么一般要在主调函数中对被调函数进行说明。除非:(1)被调函数的返回值类型为整型或字符型(2)被调函数出现在主调函数之前。

4)对函数的说明和定义是不同的,定义是指对函数功能的确立,包括指定函数名,函数值类型,形参及其类型、函数体等。说明则只是对已定义的函数返回值类型进行说明,只包括函数名、函数类型以及一个空的括弧,不包括形参和函数体。

5)c语言允许函数的递归调用(在调用一个函数的过程中又出现直接或间接的调用该函数本身)。

4. 数组作为函数参数

1)数组元素作为函数参数 和一般变量相同

2)数组名作参数应该在主调和被调函数分别定义数组,形参数组的大小可以不定义。注意:数组名作参数,不是单向传递。

3)多维数组作参数,在被调函数中对形参数组定义时可以省略第一维的大小说明,但不能省略第二维或更高维的说明。

5. 局部变量和全局变量

从变量作用域角度分,变量可分为局部变量和全局变量。

1)内部变量(局部变量)

在一个函数内定义,只在函数范围内有效的变量。

2)外部变量(全局变量)

在函数外定义,可以为本文件其它函数所共用,有效范围从定义变量的位置开始到本文件结束。建议尽量少使用全局变量,因为它在程序全部执行过程中都占用资源,而且使函数的通用性降低了。如果在定义外部变量之前的函数要想使用该外部变量,则应在该函数中用extern作外部变量说明。

6. 动态存储变量与静态存储变量

从变量值存在的时间(生存期)角度来分,可分为静态存储变量和动态存储变量。静态存储指在程序运行期间给变量分配固定的存储空间,动态存储指程序运行期间根据需要动态的给变量分配存储空间。

C语言中,变量的存储方法分为两大类:静态存储类和动态存储类,具体包括:自动的(auto),静态的(static),寄存器的(register),外部的(extern)。

1) 局部变量的存储方式

函数中的局部变量如不作专门说明,都之auto的,即动态存储的,auto可以省略。局部变量也可以定义为static的,这时它在函数内值是不变的。静态局部变量如不赋初值,编译时系统自动赋值为0,动态局部变量如不赋初值,则它的值是个不确定的值。C规定,只有在定义全局变量和局部静态变量时才能对数组赋初值。为提高执行效率,c允许将局部变量值放在寄存器中,这种变量叫register变量,要用register说明。但只有局部动态变量和形式参数可以作为register变量,其它不行。

2) 全局变量的存储方式

全局变量在函数外部定义,编译时分配在静态存储区,可以在程序中各个函数所引用。多个文件的情况如何引用全局变量呢?假如在一个文件定义全局变量,在别的文件引用,就要在此文件中用extern对全局变量说明,但如果全局变量定义时用static的话,此全局变量就只能在本文件中引用了,而不能被其它文件引用。

3) 存储类别小结

从作用域角度分,有局部变量和全局变量

局部变量:自动变量,即动态局部变量(离开函数,值就消失)

静态局部变量(离开函数,值仍保留)

 寄存器变量(离开函数,值就消失)

 (形参可定义为自动变量和寄存器变量)

全局变量:静态全局变量(只限本文件引用)

 全局变量(允许其它文件引用)

从存在的时间分,有静态存储和动态存储

动态存储:自动变量(本函数内有效)

 寄存器变量(本函数内有效)

 形参

静态存储:静态局部变量(函数内有效)

 静态全局变量(本文件内有效)

 全局变量(其它文件可引用)

从变量值存放的位置分

静态存储区:静态局部变量

  静态全局变量

全局变量

动态存储区:自动变量和形参

寄存器内:寄存器变量

7. 内部函数和外部函数

内部函数:只能被本文件中的其它函数调用,定义时前加static,内部函数又称静态函数。

外部函数:可以被其它文件调用,定义时前加extern,如果省略,则隐含为外部函数,在需要调用此函数的文件中,一般要用extern说明。

第八章 预编译处理

c编译系统在对程序进行通常的编译之前,先进行预处理。c提供的预处理功能主要有以下三种:1)宏定义 2)文件包含 3)条件编译

1. 宏定义

不带参数的宏定义

用一个指定的标识符来代表一个字符串,形式:#define 标识符 字符串

几点说明:

1) 宏名一般用大写

2) 宏定义不作语法检查,只有在编译被宏展开后的源程序时才会报错

3) 宏定义不是c语句,不在行末加分号

4) 宏名有效范围为定义到本源文件结束

5) 可以用#undef命令终止宏定义的作用域

6) 在宏定义时,可以引用已定义的宏名

带参数的宏定义

定义形式:#define 宏名(参数表) 字符串

这和函数有些类似,但他们是不同的:

1) 函数调用时,先求实参表达式值,再代入形参,而宏只是简单替换,并不求值

2) 函数调用是在程序运行时分配内存的,而宏展开时并不分配内存,也没有返回值的概念

3) 对函数中的实参和形参都要定义类型,而且要求一致,宏名无类型,其参数也没有类型。

4) 函数只有一个返回值,而宏可以得到几个结果

5) 宏替换不占运行时间,只占编译时间,而函数调用占运行时间

2. 文件包含处理

#include "文件1" 就是将文件1的全部内容复制插入到#include位置,作为一个源文件进行编译。

在#include命令中,文件名可以用" "也可以用< >,假如现在file1.c中包含file2.h文件," "表示系统先在file1.c所在目录中找file2.h,如果找不到,再按系统指定的标准方式检索目录,< >表示系统直接按指定的标准方式检索目录。所以用" "保险一点。

3. 条件编译

条件编译指不对整个程序都编译,而是编译满足条件的那部分。条件编译有以下几种形式:

1)#ifdef 标识符

  程序段1

  #else

程序段2

#endif

它的作用:当标识符在前面已经被定义过(一般用#define),则对程序段1编译,否则对程序段2编译。

2)#ifndef 标识符

程序段1

#else

程序段2

#endif

它的作用和#ifdef相反,当标识符没被定义过,对程序段1编译,否则对程序段2编译。

3)#if 表达式

程序段1

  #else

 程序段2

#endif

它的作用:当表达式值为真(非0)时,对程序段1编译,否则对程序段2编译。

第九章 指针

指针说白了就是地址。指针变量就是用来存放指针(地址)的变量。

1. 变量的指针和指向变量的指针变量

读起来很拗口,说白了就是变量的地址和用来存放变量地址的地址变量。因为一个变量在编译的时候系统要为它分配一个地址,假如再用一个变量来存放这个地址,那么这个变量就叫做指向变量的指针变量,也就是用来存放变量地址的这么一个变量。所谓"指向"就是指存放××的地址,如指向变量的指针变量,"指向"就是指用来存放变量的地址,再如指向数组的指针变量,"指向"就是指存放数组的地址。只要理解了这个,指针也就不难了。另外,还有指向字符串的指针变量,指向函数的指针变量,指向指针的指针变量等。

1) 指针变量的定义

形式:类型标识符 *标识符 如:int *pointer;

要注意两点:*表示pointer是个指针变量,在用这个变量的时候不能写成*pointer, *pointer是pointer指向的变量。一个指针变量只能指向同一个类型的变量。如上面 pointer只能指向int型变量。

2)指针变量的引用

两个有关的运算符:

& 取地址运算符 &a 就代表变量a的地址

* 指针运算符  *a 就代表变量a的值

2. 数组的指针和指向数组的指针变量


数组的指针指数组的起始地址,数组元素的指针指数组元素的地址。

1)指向数组元素的指针变量的定义与赋值

定义和指向变量的指针变量定义相同,c规定数组名代表数组的首地址,即第一个数组元素地址。

2)通过指针引用数组元素

我们通常引用数组元素的形式是a[i],如果用指针可以这样引用,*(a i),或定义一个指针变量p,将数组a的首地址赋给p,p=a;然后用*(p i)引用。

注意:指针变量p指向数组a首地址,则p 指向数组a的下一元素地址,即a[1]的地址。

3)数组名作函数参数

形参数组和实参数组之间并不是值传递,而是共用同一段地址,所以在函数调用过程中如果形参的值发生变化,则实参的值也跟着变化。

4)指向多维数组的指针和指针变量

以二维数组为居多。假设定义了一个二维数组a[3][4],那么

a代表整个二维数组的首地址,也代表第0行的首地址,同时也是第0行第0列的元素的首地址。a 0和a[0]代表第0行首地址,a 1和a[1]代表第一行的首地址。

假设a是一个数组的首地址,那么如果a是一维的,a I代表第I个元素的地址,如果a是二维的,则a I代表第I行的首地址。

那么第一行第二列的元素地址如何表示呢?a[1] 2或&a[1][2]或*(a 1) 2。

我们只要记住:在二维数组中a代表整个数组的首地址,a[I]代表第I行的首地址,a[I]与*(a I)等价就行了。只要运用熟练了就没什么复杂的了。

5)指向由m个整数组成的一维数组的指针变量

如:int (*p)[4],p是一个指向包含4个元素的一维数组,如果p先指向a[0],则p 1指向a[1],即p的增值是以一维数组的长度为单位的,这里是4,举个例子:

假设a[3][4]=,p先指向a[0]也就是数组a的首地址,那么p 1就是a[1]的首地址即元素9的地址,因为在定义p时int (*p)[4],定义一维数组长度为4,所以p 1就等于加了一个一维数组的长度4。

3. 字符串的指针和指向字符串的指针变量

1)字符串的表示形式

c中字符串有两种表示形式:一种是数组,一种是字符指针

char string[]="I love c!";

char *str="I love c!";

其实指针形式也是在内存中开辟了一个数组,只不过数组的首地址存放在字符指针变量str中,千万不要认为str是一个字符串变量。

2)字符串指针作函数参数

实际上字符串指针就是数组的首地址。

3)字符指针变量与字符数组的区别

① 字符数组由若干元素组成,每个元素存放一个字符,而字符指针变量只存放字符串的首地址,不是整个字符串

② 对数组初始化要用static,对指针变量不用。

③ 对字符数组赋值,只能对各个元素赋值,不能象下面这样:

char str[14];

str="I love c!";

对指针变量可以,

char *str;

str="I love c!";

注意:此时赋给str的不是字符,而是字符串首地址。

④ 数组在定义和编译时分配内存单元,而指针变量定义后最好将其初始化,否则指针变量的值会指向一个不确定

C语言权威版学习书(C语言笔记)(2)

C/C 学习交流群,欢迎大家一起来交流提升。565122788进群就能获取C语言新手学习大礼包

猜您喜欢: