C语言难点分析
- 格式:doc
- 大小:109.50 KB
- 文档页数:25
C语言程序设计教案教学目标1、掌握C语言的基本语法和编程方法;2、能够编写简单的C程序;3、掌握程序调试的基本技巧。
教学内容1、C语言的基本语法和数据类型;2、C语言的运算符和表达式;3、C程序的流程控制;4、C语言的函数和数组;5、C程序的调试技巧。
教学重点与难点重点:C语言的基本语法和编程方法,程序调试的基本技巧。
难点:C程序的流程控制,函数和数组的应用。
教学方法1、理论教学:通过PPT等多媒体手段,讲解C语言的基本语法和编程方法,让学生了解C语言的特点和应用;2、实践教学:通过编写简单的C程序,让学生掌握C语言的编程方法和程序调试的基本技巧;3、案例教学:通过案例分析,让学生了解C程序的设计思路和实现方法。
教学步骤1、导入新课:介绍C语言的特点和应用,激发学生的学习兴趣;2、讲解理论知识:通过PPT等多媒体手段,讲解C语言的基本语法和编程方法;3、实践操作:让学生编写简单的C程序,掌握C语言的编程方法和程序调试的基本技巧;4、案例分析:通过案例分析,让学生了解C程序的设计思路和实现方法;5、总结与回顾:回顾本节课所学的知识点,总结重点和难点。
作业布置1、完成教学PPT上的相关练习题;2、自行编写一个简单的C程序,实现基本的计算器功能。
C语言程序设计教案教学目标1、掌握C语言的基本语法和编程方法;2、能够编写简单的C程序;3、掌握程序调试的基本技巧。
教学内容1、C语言的基本语法和数据类型;2、C语言的运算符和表达式;3、C程序的流程控制;4、C语言的函数和数组;5、C程序的调试技巧。
教学重点与难点重点:C语言的基本语法和编程方法,程序调试的基本技巧。
难点:C程序的流程控制,函数和数组的应用。
教学方法1、理论教学:通过PPT等多媒体手段,讲解C语言的基本语法和编程方法,让学生了解C语言的特点和应用;2、实践教学:通过编写简单的C程序,让学生掌握C语言的编程方法和程序调试的基本技巧;3、案例教学:通过案例分析,让学生了解C程序的设计思路和实现方法。
C语言的知识点和难点总结C语言是一种基础编程语言,广泛应用于系统软件、嵌入式系统、游戏开发等领域。
在学习C语言的过程中,我们会遇到一些知识点和难点。
下面,我们将对C语言的知识点和难点进行总结。
一、知识点:1.数据类型:C语言支持多种数据类型,包括整型、浮点型、字符型等。
这些数据类型的使用是C语言编程的基础,需要熟练掌握。
2.运算符:C语言提供了丰富的运算符,如算术运算符、关系运算符、逻辑运算符等。
理解并正确使用这些运算符是编写高效代码的关键。
3.控制结构:C语言中的控制结构包括条件语句(如if-else)、循环语句(如for、while)等。
掌握这些控制结构是实现程序逻辑的关键。
4.函数:函数是C语言的基本模块,用于实现特定的功能。
了解如何定义函数、调用函数以及传递参数是十分重要的。
5.指针:指针是C语言的特色之一,它允许我们直接访问内存地址。
理解指针的概念和用法对于深入学习C语言至关重要。
6.结构体与联合:结构体和联合是C语言中处理复杂数据结构的重要工具。
通过它们,我们可以组合不同类型的数据并进行操作。
二、难点:1.指针操作:由于指针直接涉及内存地址,因此对初学者来说可能较难理解。
掌握指针的基本概念、声明、初始化和使用是C语言学习的难点之一。
2.内存管理:在C语言中,程序员需要直接管理内存。
如何正确地分配和释放内存是避免内存泄漏和段错误的关键,也是学习C语言的难点。
3.深度递归:深度递归可能导致栈溢出或性能问题,因此在实际应用中需要谨慎处理。
理解递归原理并在合适的场景下应用是C语言学习的一个难点。
4.多线程编程:多线程编程涉及线程的创建、同步和通信等复杂概念,对于初学者来说可能较难掌握。
理解多线程的原理和应用是多线程编程的难点之一。
嵌入式C语言的八大难点揭秘本文将带您了解一些良好的和内存相关的编码实践,以将内存错误保持在控制范围内。
内存错误是C 和C++ 编程的祸根:它们很普遍,认识其严重性已有二十多年,但始终没有彻底解决,它们可能严重影响应用程序,并且很少有开发团队对其制定明确的管理计划。
但好消息是,它们并不怎么神秘。
▶引言C 和 C++ 程序中的内存错误非常有害:它们很常见,并且可能导致严重的后果。
来自计算机应急响应小组(请参见参考资料)和供应商的许多最严重的安全公告都是由简单的内存错误造成的。
自从 70 年代末期以来,C 程序员就一直讨论此类错误,但其影响在至今年仍然很大。
更糟的是,如果按我的思路考虑,当今的许多C 和C++ 程序员可能都会认为内存错误是不可控制而又神秘的顽症,它们只能纠正,无法预防。
但事实并非如此。
本文将让您在短时间内理解与良好内存相关的编码的所有本质:▶正确的内存管理的重要性存在内存错误的C 和C++ 程序会导致各种问题。
如果它们泄漏内存,则运行速度会逐渐变慢,并最终停止运行;如果覆盖内存,则会变得非常脆弱,很容易受到恶意用户的攻击。
从1988 年著名的莫里斯蠕虫攻击到有关Flash Player 和其他关键的零售级程序的最新安全警报都与缓冲区溢出有关:“大多数计算机安全漏洞都是缓冲区溢出”,Rodney Bates 在 2004 年写道。
在可以使用C 或C++ 的地方,也广泛支持使用其他许多通用语言(如Java?、Ruby、Haskell、C#、Perl、Smalltalk 等),每种语言都有众多的爱好者和各自的优点。
但是,从计算角度来看,每种编程语言优于C 或C++ 的主要优点都与便于内存管理密切相关。
与内存相关的编程是如此重要,而在实践中正确应用又是如此困难,以致于它支配着面向对象编程语言、功能性编程语言、高级编程语言、声明性编程语言和另外一些编程语言的所有其他变量或理论。
与少数其他类型的常见错误一样,内存错误还是一种隐性危害:它们很难再现,症状通常不能在相应的源代码中找到。
C语言程序设计项目重点与难点《C程序设计》实验项目重点与难点1.C程序的运行环境和运行C程序的方法重点:简单的C程序格式,包括main()函数、数据说明、函数开始和结束标志等。
难点:编程入门以及对语言的理解。
2.数据类型、运算符和简单的输入输出重点:C的几种基本数据类型,不同类型数据间的混合运算规则;不同运算符的使用特点,清楚每种运算符的优先级与结合性;各种表达式的含义与使用要点。
难点:不同类型数据间的混合运算;运算符的优先级与结合性。
3.顺序程序设计重点:顺序结构程序的表达式语句形式;输入/输出函数的表示与调用方法;利用流程图加深对顺序结构程序的理解。
难点:格式输入与输出表示中各种格式字符的表示含义。
4.选择结构程序设计重点:关系、逻辑运算符及其表达式的语法形式;if语句;switch 语句。
难点:关系与逻辑运算符表达式的结果判定;if语句嵌套的层次判定;程序中使用break语句运行结果的判定。
5.循环结构程序设计重点:while语句、do…while语句、for语句的结构及其使用方法;break 语句和continue的应用及其区别;难点:常用的循环程序设计方法及算法特点,并能编写相应的程序。
6.数组重点:一维数组、二维数组;字符数组与字符串的概念与定义方法,常用的字符串处理函数。
难点:数组下标的起始数问题;利用数组形式进行程序设计的一般方法与典型算法。
7.函数重点:函数定义的一般形式;函数的调用的几种形式;函数嵌套调用的一般过程;数组名作为函数的参数的一些特点;局部变量与全局变量的概念及它们的使用特点。
难点:不同的函数参数传递方法在程序中应用的结果判定;利用函数调用方法实现程序设计中涉及的参数定义、参数传递以及返回值问题;函数调用的理解。
8.指针重点:指针变量定义、初始化和引用;数组的指针和指向数组的指针变量;字符串的指针和指向字符串的指针变量;指针数组与指向指针的指针。
难点:指针概念深刻理解;区别指向数组的指针和指针数组;指向指针的指针;有关指针的数据类型定义和指针的相关运算。
C语言选择结构程序设计教案一、教学目标1. 理解选择结构的概念和作用。
2. 掌握if语句和switch语句的语法和使用方法。
3. 能够运用选择结构解决实际问题。
二、教学内容1. 选择结构的概念和作用。
2. if语句的语法和使用方法。
3. switch语句的语法和使用方法。
4. 选择结构的嵌套。
三、教学重点与难点1. 重点:if语句和switch语句的语法和使用方法。
2. 难点:选择结构的嵌套和运用。
四、教学方法1. 讲解:讲解选择结构的概念和作用,以及if语句和switch语句的语法和使用方法。
2. 示例:通过示例演示如何使用选择结构解决实际问题。
3. 练习:让学生通过练习掌握选择结构的运用。
五、教学准备1. 教材或教案。
2. 计算机和投影仪。
3. 练习题。
六、教学过程1. 引入:通过一个简单的例子,比如判断一个数的正负,引入选择结构的概念。
2. 讲解:详细讲解if语句和switch语句的语法和使用方法,包括条件表达式和分支语句。
3. 示例:给出一些示例代码,演示如何使用if语句和switch语句来实现不同的选择结构。
4. 练习:让学生编写一些简单的程序,练习使用if语句和switch语句。
七、案例分析1. 案例一:编写一个程序,根据用户输入的年份,判断是平年还是闰年。
2. 案例二:编写一个程序,根据用户输入的分数,判断成绩等级。
八、选择结构的嵌套1. 讲解:讲解选择结构嵌套的概念和作用。
2. 示例:给出一些示例代码,演示如何使用选择结构嵌套来解决更复杂的问题。
3. 练习:让学生编写一些程序,练习使用选择结构嵌套。
九、课堂互动1. 提问:让学生回答关于选择结构的问题,比如if语句和switch语句的区别等。
2. 讨论:让学生分组讨论如何使用选择结构解决实际问题,并展示他们的解决方案。
十、总结与作业1. 总结:总结本节课所学的内容,包括选择结构的概念、if语句和switch语句的语法和使用方法,以及选择结构的嵌套。
C 语言课程设计遇到的问题与解决方法一、引言C 语言作为一种通用的高级编程语言,具有高效、灵活和强大的特点,因此在计算机科学和程序设计等领域广泛应用。
在许多大学和技术学院的计算机课程中,C 语言课程设计是非常重要的一环,通过设计不同的项目来提高学生的编程能力和实践经验。
然而,在进行 C 语言课程设计的过程中,学生们常常会遇到各种各样的问题,例如代码逻辑不清晰、程序运行出错等,本文将对 C 语言课程设计中常见的问题进行深入探讨,并给出解决方法。
二、常见问题及解决方法1. 问题:逻辑思维不清晰在进行 C 语言课程设计时,许多学生常常会遇到逻辑思维不清晰的问题,导致编写的代码难以理解和调试。
这种情况下,学生往往会陷入困惑和迷茫。
解决方法:在进行 C 语言课程设计之前,学生可以先思考整个程序的逻辑结构,并将逻辑关系用流程图或伪代码表示出来,以便更好地理清程序的结构和功能。
在编写代码的过程中,可以注释适当的备注,帮助自己理解和记忆整个程序的逻辑。
2. 问题:语法错误导致程序无法运行C 语言是一种对语法要求非常严格的语言,因此在编写代码时很容易出现语法错误,导致程序无法正常运行。
解决方法:为了避免语法错误,学生可以通过阅读相关的编程书籍或参考在线编程教程来加强对 C 语言语法的掌握。
学生还可以在编写代码后,使用编译器进行语法检查,及时发现并纠正问题。
3. 问题:内存管理不当导致程序崩溃在 C 语言中,内存管理是非常重要的一个环节,如果内存管理不当,很容易导致程序崩溃或内存泄漏等问题。
解决方法:学生可以通过阅读相关的内存管理书籍或教程来深入理解C 语言中的内存管理机制,包括栈和堆的使用、指针的应用等。
学生还可以多加练习,编写涉及内存管理的程序,以加深对内存管理的理解和掌握。
4. 问题:程序性能不佳在进行 C 语言课程设计时,学生常常会遇到程序性能不佳的问题,例如运行速度慢、内存占用大等。
解决方法:为了提高程序性能,学生可以通过对算法进行优化,使用更高效的数据结构,如数组、链表等,或者使用并行计算技术来提高程序的运行效率。
计算机等级考试二级C语言重点难点分析与题解第1章应试指南第2章数据结构与算法本章节主要考查算法的基本概念、基本的数据结构及其基本操作、查找和排序算法。
本章的内容在历次试题中所占的比例约为11.2%,都是以选择题和填空题的形式出现的。
本章历次试题分数分布如表2-1所示。
从表2-1中我们可以看出,算法的基本概念、数据结构的定义、栈和树几乎是每次必考的知识点;查找和排序基本上每次有一道试题;线性表、队列和线性链表很少单独出题,但经常与其它知识点结合出题。
本章涉及知识点分值在历次试题中比重如图2-1所示。
2.1 算法的基本概念从图2-1可以看出,该节知识点所占试题比重为18%,属于重点考查对象,基本上每次必考,主要考查算法的定义和对算法复杂度的理解。
历次试题分值在0-4分之间波动,其变化趋势如图2-2所示。
2.1.1 考点1:算法的定义算法是对一个问题求解步骤的一种描述,是求解问题的方法,它是指令的有限序列,其中每条指令表示一个或者多个操作。
一般来说,一个算法具有以下5个主要的特征。
(1)有穷性:一个算法(对任何合法的输入)在执行有穷步后能够结束,并且在有限的时间内完成。
(2)确定性:算法中的每一步都有确切的含义。
(3)可行性:算法中的操作能够用已经实现的基本运算执行有限次来实现。
(4)输入:一个算法有零个或者多个输入,零个输入就是算法本身缺定了初始条件。
(5)输出:一个算法有一个或者多个输出,以反映出数据加工的结果。
例2.1.1 问题处理方案的正确而完整的描述称为______。
[2005年4月填空第5题]答案:算法例2.1.2 一个算法应该具有“确定性”等5个特性,下面对另外4个特性的描述中错误的是()。
A.有零个或多个输入 B.有零个或多个输出C.有穷性 D.可行性答案:B例2.1.3 算法具有5个特性,以下选项中不属于算法特性的是()。
A.有穷性 B.简洁性 C.可行性 D.确定性答案:B第3章程序设计基础本章主要考查程序设计的一些基本知识,比如程序设计的方法与风格、结构化程序设计与面向对象程序设计的基本思想。
C语言遇到的问题、解决方法及结果1.引言C语言作为一种广泛应用的高级编程语言,常常用于开发系统软件、嵌入式软件以及数据结构等领域。
在使用C语言进行开发过程中,我们会遇到各种问题,本文将讨论常见的问题,并提供相应的解决方法及结果。
2.内存管理问题2.1内存泄漏问题描述:C语言中没有自动内存管理机制,因此在使用动态分配内存时,如果没有释放已使用的内存,就会导致内存泄漏。
解决方法:及时释放已使用的内存是避免内存泄漏的关键。
在每次动态分配内存后,务必记得使用`f re e()`函数释放内存。
结果:通过及时释放内存,可以有效避免内存泄漏问题,提高程序的内存利用效率。
2.2指针问题问题描述:由于C语言中指针的概念较为复杂,容易出现指针使用错误、野指针等问题。
解决方法:在使用指针时,需要保证指针的合法性,避免野指针问题。
同时,可以使用调试工具检查指针的值,以便及时发现和修复指针相关的问题。
结果:通过正确使用指针,可以避免指针相关的错误,提高程序的稳定性。
3.编译问题3.1编译错误问题描述:在使用C语言进行开发时,常常会遇到编译错误,如语法错误、缺少头文件等。
解决方法:仔细检查编译错误的提示信息,根据提示信息进行错误排查。
合理使用编译器提供的调试工具,例如使用`-W al l`选项开启所有警告信息,帮助发现潜在的问题。
结果:通过仔细排查编译错误并进行修复,可以确保程序的正确编译,提高开发效率。
3.2编译器兼容性问题描述:不同的编译器可能对C语言标准的支持程度不同,导致同一份代码在不同编译器下的行为不一致。
解决方法:在开发时,要考虑到目标平台使用的编译器,并根据编译器的要求进行相应的调整和优化。
可以使用条件编译等技术,在不同的编译器下使用不同的代码逻辑。
结果:通过确保程序在目标平台下编译通过,可以提高程序的可移植性和兼容性。
4.性能优化问题4.1程序运行缓慢问题描述:C语言程序在运行过程中可能会因为算法设计不合理、性能瓶颈等原因导致运行缓慢。
C语言难点及分析C语言是一种贴近硬件的高级编程语言,常用于嵌入式系统、操作系统和底层开发等领域。
虽然C语言相对于其他编程语言来说比较简单,但仍有一些难点需要注意和分析。
一、指针的理解和使用指针是C语言中的一个重要概念,也是相对较难的部分之一、学习指针的难点主要在于其抽象和概念的理解,以及指针的使用方式。
指针可以理解为内存地址,它指向存储单元的位置。
通过指针可以直接操作内存中的数据,使得程序更加高效灵活。
但是,指针的错误使用可能导致程序崩溃或产生未知的结果,因此需要特别小心。
指针的难点主要表现在以下几个方面:1.指针和变量的关系理解:指针和变量之间是一种间接关系,指针是存储变量地址的变量。
2.指针的声明和初始化:指针变量的声明和初始化需要注意语法和语义的细节,如指针的类型和指针所指向的数据类型。
3.指针的运算和使用:指针可以进行递增和递减运算,也可以用于数组、函数和结构体等复杂数据结构的操作。
二、内存管理C语言中,需要手动进行内存的申请和释放,这是相对于高级语言的一种特殊机制。
内存的申请和释放需要遵循一定的规则,否则可能会引发内存泄漏或者野指针的问题。
内存管理的难点主要表现在以下几个方面:1. 动态内存分配:动态内存分配是指在程序运行过程中根据需要申请和释放内存。
C语言中提供了动态内存分配的函数,如malloc、calloc和realloc等,但需要特别注意内存的申请大小和合理的内存释放。
2.内存泄漏和野指针:内存泄漏是指程序申请到内存后,没有进行正确释放导致内存一直占用。
而野指针是指指向无效内存地址的指针,可能会引发程序崩溃或产生未知的错误结果。
三、字符串的处理C语言中,字符串是以字符数组的形式来表示的。
字符串的处理涉及到字符的操作、字符串的拼接和比较、字符串的查找和替换等功能,对于初学者来说可能比较困难。
字符串处理的难点主要表现在以下几个方面:1.字符串数组和字符数组的区别:字符串必须以'\0'结尾,表示字符串的结束符,而字符数组可以不需要。
C语言难点分析函数:对于函数最基本的理解是从那个叫main的单词开始的,一开始总会觉得把语句一并写在main里不是挺好的么,为什么偏择出去。
其实这是因为对函数还不够熟练,否则函数的运用会给我们编程带来极大的便利。
我们要知道函数的返回值类型,参数的类型,以及调用函数时的形式。
事先的函数说明也能起到一个提醒的好作用。
所谓形参和实参,即在调用函数时写在括号里的就是实参,函数本身用的就是形参,在画流程图时用平行四边形表示传参。
函数的另一个应用例子就是递归了,笔者开始比较头疼的问题,反应总是比较迟钝,按照老师的方法,把递归的过程耐心准确的逐级画出来,学习的效果还是比较好的,会觉得这种递归的运用是挺巧的,事实上,著名的八皇后、汉诺塔等问题都用到了递归。
例子:long fun(int n{long s;if(n==1||n==2 s=2;else s=n-fun(n-1;return s;}main({printf("%ld",fun(4;}数组:分为一维数组和多维数组,其存储方式画为表格的话就会一目了然,其实就是把相同类型的变量有序的放在一起。
因此,在处理比较多的数据时(这也是大多数的情况)数组的应用范围是非常广的。
具体的实际应用不便举例,而且绝大多数是与指针相结合的,笔者个人认为学习数组在更大程度上是为学习指针做一个铺垫。
作为基础的基础要明白几种基本操作:即数组赋值、打印、排序(冒泡排序法和选择排序法)、查找。
这些都不可避免的用到循环,如果觉得反应不过来,可以先一点点的把循环展开,就会越来越熟悉,以后自己编写一个功能的时候就会先找出内在规律,较好的运用了。
另外数组做参数时,一维的[]里可以是空的,二维的第一个[]里可以是空的但是第二个[] 中必须规定大小。
冒泡法排序函数:void bubble(int a[],int n{int i,j,k;for(i=1,ifor (j=0;j< n-i-1; j++if (a[j]>a[j+1]{k=a[j];a[j]=a[j+1];a[j+1]=k;}}选择法排序函数:void sort( int a[] , int n {int i,j,k,t;for (i=0,i< n-1 ;i++{k=i;for ( j=i+1 ;jif (a[k] k=j ;if ( k!=i{t=a;a=a[k];a[k]=t;}}}折半查找函数(原数组有序):void search( int a[] , int n, int x {int left=0,right=n-1,mid,flag=0; while ((flag==0&&(left<=right{mid=(left+right/2;if (x==a[mid]{printf(" %d%d ",x,mid;flag =1;}else if (x right=mid-1;else left=mid+1 ;}}相关常用的算法还有判断回文,求阶乘,Fibanacci数列,任意进制转换,杨辉三角形计算等等。
字符串:字符串其实就是一个数组(指针),在scanf的输入列中是不需要在前面加“&”符号的,因为字符数组名本身即代表地址。
值得注意的是字符串末尾的‘’,如果没有的话,字符串很有可能会不正常的打印。
另外就是字符串的定义和赋值问题了,笔者有一次的比较综合的上机作业就是字符串打印老是乱码,上上下下找了一圈问题,最后发现是因为而不是前者没有说明指向哪儿,更没有确定大小,导致了乱码的错误,印象挺深刻的。
另外,字符串的赋值也是需要注意的,如果是用字符指针的话,既可以定义的时候赋初值,即也可以在赋值语句中赋值,即但如果是用字符数组的话,就只能在定义时整体赋初值,即char a[5]={"abcd"};而不能在赋值语句中整体赋值。
常用字符串函数列表如下,要会自己实现:函数作用函数调用形式备注字符串拷贝函数strcpy(char*,char*后者拷贝到前者字符串追加函数strcat(char*,char*后者追加到前者后,返回前者,因此前者要足够大字符串比较函数strcmp(char*,char*前者等于、小于、大于后者时,返回0、正值、负值。
注意,不是比较长度,是比较字符ASCII码的大小,可用于按姓名字母排序等。
字符串长度strlen(char * 返回字符注:对字符串是不允许做==或!=的运算的,只能用字符串比较函数指针:指针可以说是C语言中最关键的地方了,其实这个“指针”的名字对于这个概念的理解是十分形象的。
首先要知道,指针变量的值(即指针变量中存放的值)是指针(即地址)。
指针变量定义形式中:基本类型 *指针变量名中的“*”代表的是这是一个指向该基本类型的指针变量,而不是内容的意思。
在以后使用的时候,如*ptr=a时,“*”才表示ptr所指向的地址里放的内容是a。
指针比较典型又简单的一应用例子是两数互换,看下面的程序,swap(int c,int d{int t;t=c;c=d;d=t;}main({int a=2,b=3;swap(a,b;printf(“%d,%d”,a,b;}这是不能实现a和b的数值互换的,实际上只是形参在这个函数中换来换去,对实参没什么影响。
现在,用指针类型的数据做为参数的话,更改如下:swap(#3333FF *p1,int *p2{int t;t=*p1;*p1=*p2;*p2=t;}main({int a=2,b=3;int *ptr1,*ptr2;ptr1=&a;ptr2=&b;swap(prt1,ptr2;printf(“%d,%d”,a,b;}这样在swap中就把p1,p2 的内容给换了,即把a,b的值互换了。
指针可以执行增、减运算,结合++运算符的法则,我们可以看到:指针和数组实际上几乎是一样的,数组名可以看成是一个常量指针,一维数组中ptr=&b[0]则下面的表示法是等价的:a[3]等价于*(a+3ptr[3]等价于*(ptr+3下面看一个用指针来自己实现atoi(字符串型->整型)函数:int atoi(char *s{int sign=1,m=0;if(*s=='+'||*s=='-' /*判断是否有符号*/sign=(*s++=='+'?1:-1; /*用到三目运算符*/while(*s!='' /*对每一个字符进行操作*/{m=m*10+(*s-'0';s++; /*指向下一个字符*/}return m*sign;}指向多维数组的指针变量也是一个比较广泛的运用。
例如数组a[3][4],a代表的实际是整个二维数组的首地址,即第0行的首地址,也就是一个指针变量。
而a+1就不是简单的在数值上加上1了,它代表的不是a[0][1],而是第1行的首地址,&a[1][0]。
指针变量常用的用途还有把指针作为参数传递给其他函数,即指向函数的指针。
看下面的几行代码:void Input(ST *;void Output(ST *;void Bubble(ST *;void Find(ST *;void Failure(ST *;/*函数声明:这五个函数都是以一个指向ST型(事先定义过)结构的指针变量作为参数,无返回值。
*/void (*process[5](ST *={Input,Output,Bubble,Find,Failure};/*process被调用时提供5种功能不同的函数共选择(指向函数的指针数组)*/printf("\nChoose:\n?";scanf("%d",&choice;if(choice>=0&&choice<=4总之,指针的应用是非常灵活和广泛的,不是三言两语能说完的,上面几个小例子只是个引子,实际编程中,会逐渐发现运用指针所能带来的便利和高效率。
文件:注:以上用于文本文件的操作,如果是二进制文件就在上述字母后加“b”。
我们用文件最大的目的就是能让数据保存下来。
因此在要用文件中数据的时候,就是要把数据读到一个结构(一般保存数据多用结构,便于管理)中去,再对结构进行操作即可。
例如,文件aa.data中存储的是30个学生的成绩等信息,要遍历这些信息,对其进行成绩输出、排序、查找等工作时,我们就把这些信息先读入到一个结构数组中,再对这个数组进行操作。
如下例:#include#include#define N 30 typedef struct student /*定义储存学生成绩信息的数组*/{char *name;int chinese;int maths;int phy;int total;}ST;main({ST a[N]; /*存储N个学生信息的数组*/FILE *fp;void (*process[3](ST *={Output,Bubble,Find}; /*实现相关功能的三个函数*/int choice,i=0;Show(;printf("\nChoose:\n?";scanf("%d",&choice;while(choice>=0&&choice<=2{fp=fopen("aa.dat","rb";for(i=0;i ;i++fread(&a, sizeof (ST,1,fp; /*把文件中储存的信息逐个读到数组中去*/fclose(fp;(*process[choice] (a ; /*前面提到的指向函数的指针,选择操作*/printf( "\n" ;Show(;printf( "\n?" ;scanf( "%d" ,&choice;}}void Show({printf( "\n****Choices:****\n0.Display the data form\n1.Bubble it according to the total score\n2.Search\n3.Quit!\n" ;}void Output( ST *a /*将文件中存储的信息逐个输出*/{int i,t=0;printf( "Name Chinese Maths Physics Total\n" ;for (i=0;i{t=a.chinese+a.maths+a.phy;a.total=t;printf( "%4s%8d%8d%8d%8d\n" ,,a.chinese,a.maths,a.phy,a.tota l;}}void Bubble( ST *a /*对数组进行排序,并输出结果*/{int i,pass;ST m;for (pass=0;pass ;pass++for (i=0;i ;i++if (a.total{m=a; /*结构互换*/a=a[i+1];a[i+1]=m;}Output( a ;}void Find (ST *a{int i,t=1;char m[20];printf( "\nEnter the name you want:" ;scanf( "%s" ,m;for (i=0;iif ( !strcmp(m, /*根据姓名匹配情况输出查找结果*/{printf( "\nThe result is:\n%s, Chinese:%d,Maths:%d, Physics:%d,Total:%d\n" ,m,a.chinese,a.maths,a.phy,a.t otal;t=0;}if ( tprintf( "\nThe name is not in the list!\n" ;}链表:链表是C语言中另外一个难点。