C语言学习难点重点


21 天学通 C 语言 1、三种基本结构:顺序结构、选择结构和循环结构; 2、无形参的 main 函数声明要写”int main(void)”,要有”return 0”,注意有形参 main 函数的 声明; 3、标识符,关键字,保留字,标准函数库的函数名,

4、在数字上加上前缀和后缀,可以表示其数字类型:

5、sizeof(short int)=2;sizeof(long int)=4; sizeof(long long int)=8;其为字节数; 6、 防止溢出,在 vc++中,不支持 long long

7、浮点数类型
1

Float 型变量能正确显示有效数字 7 位,double 型和 long double 型能正确显示小数点后 16 位;

注意 float 型在初始化时,在数字后面加上 f;

8、限定词 const 和 volatile: Const 主要作用是定义只读变量,只读变量的值在定义后不能再被改变; Volatile 告诉编译器修饰的变量是随时可能变化的, 编译器优化时必须每次都重新读取这 个变量的值,而不是使用保存在寄存器里的备份; 9、const volatile int data=10;的含义, 如果两个程序共享一块内存,外部程序改变了这块内 存的值,而这段程序中变量 data 的值是不应该改变的,因此,data 值必须从内存中读取, 且不可改变。 10、整数的除法和浮点数除法有很大不同,整数除会产生截尾,趋零截尾 11、简化程序设计,增强可读性,可以使用宏定义和 case 语句的结合。

2

可以让看程序的人了解到更多的信息,容易明白每个分支的任务; 12、if else 语 句 若 有 赋 值 语 句 , 则 可 以 用 条 件 表 达 式 代 替 , 比 如

13、编程时不要使用冗长复杂的结构,如果一定要使用,则在合适的位置加上括号; 14、巧用隐式选择

If(a!=0&&b/a>=a) {do something} 只有 a 不为 0 时,才能作为除数,b/a 才算合法 15、提示输入,以达到要求

16、while 和 for 语句在某些用法上是相似的,在不需要初始化或者不需要改变循环变量的 时候,使用 while 语句。 17、Continue 语句的使用法则

3

Else 操作复杂的情况,使用 if else 语句显得结构不和谐,可读性差,把 if 头改为:if(!表达 式),这样的话违背了正常和重要的分支放在 if 体内的原则,这时可以采用 continue 语句。

如果 else 只有一句或者使用 continue 或者 break,退出循环; 18、双重 for 循环,数组的输入

19、数组的元素从第 0 个开始,在 for 中,第三个语句一般使用前加加,如果++i; 20、数组的容量大小可以使用宏定义

21、字符的初始化

4

22、函数的声明需要在 main 之外

21、变量定义就是定义函数中需要用到的变量。C 函数中的变量定义必须放在函数体的最前 面,允许变量定义之间有空行,但不能包括函数操作。下面的程序变量 i 和变量 j 的定义在 函数操作语句之后,没有放在函数体的最前面,因此,编译时程序将报错。

5

如果变量 j 和 i,max 属于不同的作用域,这种情况下的变量定义不必放在最前面。 22、头文件原则存放可能被外部使用的内容,一般包含以下部分:类型声明,函数声明,变 量定义,包括具名常量和 const 常量。

23、文件管理:

24、函数在调用时不用再写函数和参数的类型 25、Extern 声明,在没有定义某函数的源文件里使用 extern 声明该函数,便可以在这个文件 使用该函数,在函数定义的函数声明中使用关键字 extern,该函数就允许为其他文件的函数 使用。 26、外部函数需要事先声明:

6

27、在自己作用域的函数,则在写函数时,需要加上 static 的定义:

28、函数声明的区别 void print_array(int array[SIZE])和 void print_array(char *array[SIZE]); 29、Static 变量还可以分为 static 局部变量和 static 全局变量 30、写函数,很多时候将 main 函数写在最后,这样就免去了定义函数的麻烦。 31、生存期是指程序运行时变量占有内存的整个时期, 作用域是指变量可以被使用的代码区

域,
7

在一个程序块或下层程序块中定义的变量, 可以称为该程序块的内部变量, 内部变量的作用 域不能超过本层程序块。

32、在子函数中定义的局部变量只能在调用函数时才会被分配内存空间; 函数结束时, 局部 变量的空间会被销毁。 33、全局变量:过度使用全局变量会导致资源浪费,不宜对全局变量做过多操作,破坏信息 封装性; 34、不仅多个函数可以使用同名变量,而且不同程序块也可以使用同名变量; 35、C 语言的变量都有两个属性:数据类型和存储类别,分为 auto,static,register,extern;在 C 语言中,内存存储区可以分为 4 种:栈、堆、静止存储区和常量存储区。 36、栈是编译器管理的动态存储区域,用来存储临时变量,在需要时被分配,不需要时编译 器回收,存放数据类型包括:函数形参,局部变量,其他临时变量,这些变量的内存分配是 动态的,编译器控制;堆是由程序管理的动态存储区域,用来分配由程序使用 malloc 函数 申请的内存空间,需要由程序自由释放;静态存储区:用来存储全局变量,该区域的内存在 程序开始时已固定分配完毕, 直到程序结束由编译器自动释放; 常量存储区用于存储程序中 的变量,同时经编译器优化后的 const 常量也可以占用区域内存; 37、Static 形容变量时,能够在函数结束时保留住内存不释放,与 auto 相反。

8

36、extern 用于声明全局变量,扩展全局变量的作用。一个程序有多个源文件,一个源文件 定义了一个全局变量后,其他源文件不能再定义统一变量名的全局变量。 37、21 天学通 C 语言 第 13 章字符串处理函数先省略不看;

38、指向数组元素的指针

39、 40、可以对数组指向的指针进行自加,但是不可以对数组名自加或赋值,语法是错误的。 41、%p 是什么意思 42、对于函数调用数组,有几种写法下面两种更加合适

9

43、

44、数组指针的用法

45、二维数组地址表示:

46、使用一维数组型和二维数组型指针的表示: 首先需要找出使用一维数组型指针变量表示 所有数组元素的表达式, 对于一维数组型指针, 应该讲其赋值为数组第 0 个一维数组的地址

10

47、字符串的复制:

48、字符串数组和字符指针数组:

49、内存区可以分为栈、堆、静态存储区和常量存储区,局部变量、函数形参、临时变量都 是在栈上获得内存的,它们的获取方式都由编译器自动执行。对堆上内存的管理,包括如下 函数:malloc 函数,free 函数,calloc 函数和 realloc 函数。

11

50、Malloc 函数可以从堆上获得指定字节数的内存空间。 如果函数执行成功, malloc 函数返 回获得的内存空间的首地址;如果函数执行失败,那么,返回值为 NULL。Malloc 函数的类 型为 void 型指针,因此可以将其值类型转换后赋值给任意类型指针。 void *malloc(int n) malloc 函数分配的内存空间是未初始化的,所以一般在使用该内存空

间时,要调用另一个函数 memset 将其初始化为全 0。 Memset 函数的函数声明如下: void *memset(void *p, int c, int n) 该函数可以将内存空间按字节为单位置为指定的字符 c。其中,p 为要清零的内存空间的首 地址,c 为要设定的值,n 为被操作的内存空间的字节长度。 Malloc 函数和 memset 函数的操作语句一般如下:

51、free 函数:从堆上获得的内存空间在程序结束后,系统不会自动将其释放,需要程序员 自己来管理,一个程序结束后,必须保证所有从堆上获得的空间已被安全释放,否则,会导 致内存泄露。 Void free(void *p); 由于形参为 void 指针,free 函数可以接受任意类型的指针 实参。

52、calloc 函数:void *calloc(int n, int size) 函数返回值为 void 型指针,如果执行成功,函数从堆上获得 size*n 的字节空间,并返回该 空间的首地址。如果执行失败,函数返回 NULL。该函数与 malloc 函数一个显著的不同是, calloc 函数得到的内存空间是经过初始化的,其内容为全 0。

12

53、realloc 函数可以实现内存分配和内存释放的功能, Void *realloc(void *p, int n); n 大于原来 p 之前指向的空间大小,那么,系统将重新为 p 从堆 上分配一块大小为 n 的内存空间,同时将 p 原来指向空间的内容依次复制到新的内存空间, p 之前指向的空间被释放。Realloc 分配的空间也是未初始化。

54、位运算赋值操作符:

55、结构体在 C 语言中用于处理多个单一数据组成的数据集合,结构体的声明

13

使用 typedef 来定义结构体,由于结构体数据类型的名字由标识符和结构体名两部分组成, 书写起来名字很长,因此,常常使用 typedef 来简化其数据类型名字:

56、初始化结构体变量,使用一个数值序列依次为结构体成员赋值:

57、358 页的程序熟记 58、当处理一组类似个人信息之类的复杂数据时,常常需要用到结构体数组

由于数组初始化序列中含有 4 个结构体值,因此,该 student 数组的数组容量为 4.另外,还 可以将所有初始化值序列放在同一个花括号内,例如:
14

59、指向结构体变量的指针, 定义一个指向结构体变量的指针与定义一个指向其他类型变量 的指针方法基本一样:

对于指针变量 p.a p->a 等价 60、宏定义和变量一样也具有作用域,对于常用宏定义,一般都写在头文件中,当源文件需 要使用时, 只需包含该头文件即可, c 语言还提供了一个预处理指令来结束宏定义的作用域。 形式如下:#undef 宏名 61、条件编译通过条件判断的方法来实现编译代码的选择, 当满足一些条件时, 编译才会编 译其指定的代码。 #ifdef 命令

程序段 1 和程序段 2 可以由若干预处理命令和语句组成,该形式的#ifdef 命令实现了程序段 1 和程序段 2 的选择编译功能,如果程序已经宏定义了标识符,则编译程序段 1;如果该标 识符未被宏定义,则对程序段 2 进行编译。此形式被广泛地用于跨平台编译。在 16 位机上 int 型的字节数为 16,在 32 位机上 int 型的字节数为 32

15

62、#ifdef 的形式二

该 形 式 常 用 于 DEBUG 版 本 的 开 发 , 一 般 程 序 开 发 都 会 有 两 个 版 本 : DEBUG 版 本 和 RELEASE 版本, DEBUG 版本供调试用,常常需要输出一些程序信息,其中标识符常为 DEBUG。 63、共用体是 C 语言的另一种高级数据结构,可以使几个不同成员共享工艺块内存。

64、c 语言使用枚举类型为常量提供了更好的解决方案,枚举类型是一组相关数据的集合。

16

APR 被初始化为 4,则后面的 MAY 被初始化为 5,JUN 为 6;由于 NOV 被初始化为 11, 则 DEC 被初始化为 12;由于 JAN 被初始化为 1,则后面的 FEB 被初始化为 2,MAR 被初 始化为 3。

65、位域属于结构体, 它允许在结构体内以位为单位将其空间划分为多个区域, 并将其分配 给结构体的各个成员。利用位域可以使用较少的字节数来存储信息。

位域成员所占空间是不能跨两个基本位域单元的, 因此如果一个位域单元的剩余空间不能容 纳一个位域成员,那么该单元剩余空间会被闲置,从下一单元开始存放该成员。
17

66、#ifdef 指令的嵌套使用:392 页的示例程序; 67、#ifndef 指令和#ifdef 命令刚好相反 68、#if 命令条件编译指令的功能与 if 语句的结构十分相似

18


相关文档

更多相关文档

C语言学习的难点
C语言学习的特点、难点和方法
C语言学习四大难点
基础----攻克C语言学习难点
语言学教程》重难点学习
《语言学概论》重点、难点
二级C语言学习四大难点分析[1]
语言学纲要重点难点解析
语言学重点难点
语言学概论重点难点问题问答
C语言难点及分析
C语言必背18个经典程序
C语言指针与数组的难点分析
2011-学习资料大全:C语言编程经典100例
C语言难点分析整理
电脑版