C语言中预处理

2024-09-01

C语言中预处理(精选12篇)

C语言中预处理 第1篇

C语言拥有简单的数据类型即整型、浮点型和字符型, 并且有简洁的格式转换形式, 可以灵活处理不同数据, 需要处理的数据量比较大并且这些数据都属于同一数据类型时, 可以将它们定义为一个数组, 便于采用统一的名字进行管理和使用。然而, 在C语言中也拥有不足之处, 就是在定义数组的同时必须指明数组的大小, 也就是可以存放数据的个数。这个个数必须是一个常数, 这就导致了在定义数组之前必须弄清楚所要存放数据量的多少, 从而给出准确定义。一旦定义的数组过大, 会造成存储空间的浪费, 影响程序执行的效率;反之, 如果定义的数组太小, 又不能满足实际需要。并且一旦程序完成, 要改变数组的大小就必须修改程序本身, 导致程序通用性差。比如, 要对一个学校各个班级学生的成绩进行相应的统计, 由于各个班级人数不一样, 就会导致每处理一个班级后都要再次修改程序, 重新统计。

在C语言中有没有一种办法可以将数组的长度定义为不定长的动态数组, 可以根据实际数据的个数自由调整数组长度, 这样既保证了数组够用, 也不会造成浪费呢?下面以对学生成绩表进行统计计算为例, 阐述使用动态数组处理这一类问题的方法。

1 一维动态数组

假定学校要计算的成绩只有一门, 比如只是为了统计期末各班数学成绩, 在程序中可以定义定长数组score[100], 这样就能计算出每一个班级的平均分和最大最小值。程序段如下:

这样固然解决了成绩统计的问题, 可是并不是每一个班级都有100人的, 这样就会造成大量空间浪费。其实, 在C语言中提供了可以根据自己需要来申请所需空间大小的内存空间动态分配函数, 利用这样的函数就可以为自己的数组申请到满足需要的空间, 从而也就解决了每个班级学生人数不同的问题, 比如malloc () 函数。malloc () 是一个可以根据用户要求而分配内存空间, 这样就可以在分配内存空间之前设置变量用于保存学生人数, 然后根据输入的学生人数来分配内存空间, 保证了内存空间够用而不浪费的原则。写程序段如下:

2 二维动态数组

用一维动态数组解决了不同班级的单科成绩求平均和最大最小值的问题, 然而在现实生活中学校面对的更多不同班级的成绩表, 要求求取每个班级每一个同学的总分, 每一门课程的平均分、最高分、最低分等问题。比如, 每一个学期结束, 中小学都要统计各个年级的班级之间不同科目的成绩情况, 每个班级也要统计不同学生的成绩情况。为了减少篇幅, 假设只需要计算每一个同学的总分。

在这样的情况下, 用一维动态数组就不能解决问题, 只能设计使用二位动态数组。假设每一个同学都有5门课, 用一个n行6列的动态二维数组, 前5列用于存放学生的原始成绩, 最后一列用于存放计算所得的每一个学生的总分。

为了在输入输出以及计算二维数组时表示直观, 我们将用于指向动态存储空间的指针P定义为行指针的形式, 这样可以直接用直观的p[i][j]的形式来表示成绩表中的每一个成绩。程序段如下:

3 动态结构数组

用二维动态数组固然能解决不同班级的成绩表问题, 可是在实际使用中并不方便, 因为在二维结构数组中只有学生的成绩, 而没有其它信息。现实中使用的成绩表要复杂得多, 比如有学生的学号、姓名等, 这样当计算并输出学生成绩就一目了然, 如果能添加上性别等信息, 还可以满足分别计算男女生的平均分等要求。

然而, 在C语言中, 简单类型的数组只能用于存放相同类型的数据, 在成绩表中的姓名、性别等信息要用字符或字符串来表示, 而分数则要用整型或者浮点型来表示, 所以, 这样的成绩表用简单类型的二维数组是不能存放和表示的。

为描述每一个学生的信息, 定义一个结构体来表示, 为简化操作, 假设学生成绩表只有姓名、语文、数学、外语和总分五项。表示如下:

这样就可以通过使用malloc () 函数来申请动态结构数组, 从而实现对每一个同学求总分的要求。程序段如下:

4 结语

本文虽然用C语言中的动态分配函数配合指针解决了成绩表统计中的班级人数不固定问题, 然而在使用动态结构数组中对于学生姓名的定义仍然采用的是定长数组的办法, 这样固然简单, 却也会造成一定的空间浪费。其实对于学生姓名的处理也可以用指向字符串的指针来解决, 从而保证每一个宝贵的内存单元都不浪费。

对于学生人数不固定的情况, 还有一种处理的办法就是使用链表, 由学生人数的多少来确定节点的增加和减少。当然那是另外的问题, 在此就不做讨论了。

参考文献

[1]PRESS W H, TEUKOLSKY S A, VETTERLING WT, et al.Nu-mericalrecipes in C[M].Cambridge Vniversity Press, 1992.

[2]谭浩强.C程序设计[M].北京:清华大学出版社, 1995.

C语言的预处理命令有哪些? 第2篇

我们可以在C源程序中插入传给编译程序的各种指令,这些指令被称为预处理器指令(等价于汇编语言中的伪指令),它们扩充了程序设计的环境。

现把常用的预处理命令总结如下:

1.预处理程序

按照ANSI标准的定义,预处理程序应该处理以下12条指令:

#if、#ifdef、#ifndef、#else、#elif、#endif、#define、#undef、#line、#error、#pragma、#include。

显然,所有的12个预处理指令都以符号#开始,每条预处理指令必须独占一行。2.#define #define指令定义一个标识符和一个串(也就是字符集),在源程序中发现该标识符时,都用该串替换之(原样替换,不要附加任何人为理解上的符号)。这种标识符称为宏名字,相应的替换称为宏代换。一般形式如下:

#define macro-name char-sequence 这种语句不用分号结尾。宏名字和串之间可以有多个空格符,但串开始后只能以新行终止。在C语言里宏定义只用来做的宏名替换,而不做语法检查的,因而它不是C语句,所以宏定义的语句结尾不需要加分号。

宏也在C里也叫预处理命令,因为宏是在程序编译前先进行字符替换的,所以叫预处理.例如:我们使用LEFT代表1,用RIGHT代表0,我们使用两个#define指令:

#define LEFT 1 #define RIGHT 0 每当在源程序中遇到LEFT或RIGHT时,编译程序都用1或0替换。定义一个宏名字之后,可以在其他宏定义中使用,例如:

#define ONE 1 #define TWO ONE+ONE #define THREE ONE+TWO 宏代换就是用相关的串替代标识符。因此,如果希望定义一条标准错误信息时,可以如下定义:

#define ERROR_MS “Standard error on input n” 如果一个串长于一行,可在行尾用反斜线””续行,如下:

#define LONG_STRING “This is a very very long

string that is used as an example”

3.#error

#error指令强制编译程序停止编译,它主要用于程序调试(放在错误的分支中,一旦进入错误的分支就显示该信息)。

#error指令的一般形式是:

#error error-message 注意,宏串error-message不用双引号包围。遇到#error指令时,错误信息被显示,可能同时还显示编译程序作者预先定义的其他内容。

4.#include 程序中的#include指令要求编译程序读入另一个源文件。被读入文件的名字必须用双引号(“”)或一对尖括号(<>)包围,例如:

#include “stdio.h” #include 都使C编译程序读入并编译头文件以用于I/O系统库函数。

包含文件中可以包含其他#include指令,称为嵌套包含。允许的最大嵌套深度随编译器而变。文件名被双括号或尖括号包围决定了对指定文件的搜索方式。文件名被尖括号包围时,搜索按编译程序作者的定义进行,一般用于搜索某些专门放置包含文件的特殊目录。当文件名被双引号包围时,搜索按编译程序实时的规定进行,一般搜索当前目录。如未发现,再按尖括号包围时的办法重新搜索一次。

通常,绝大多数程序员使用尖括号包围标准的头文件,双引号用于包围与当前程序相关的文件名。

5.条件编译指令

若干编译指令允许程序员有选择的编译程序源代码的不同部分,这种过程称为条件编译。5.1 #if、#else、#elif #endif 条件编译指令中最常用的或许是#if,#else,#elif和#endif。这些指令允许程序员根据常数表达式的结果有条件地启用(包围)部分代码。

#if的一般形式是:

#if constant-expression Statement sequence #endif 如#if后的常数表达式为真,则#if和#endif中间的代码被编译,否则忽略该代码段。#endif标记#if块的结束。

#else指令的作用与C语言的else相似,#if指令失败时它可以作为备选指令。例如:

#include #define MAX 100 Int main(void){

#if MAX>99 printf(“Compiled for array greater than 99.n”);#else printf(“Complied for small array.n”);#endif return 0;} 注意,#else既是标记#if块的结束,也标记#else块的开始。因为每个#if只能写一个#endif匹配。#elif指令的意思是“否则,如果”,为多重编译选择建立一条if-else-if(如果-否则-如果链)。如果#if表达式为真,该代码块被编译,不测试其他#elif表达式。否则,序列中的下一块被测试,如果成功则编译之。一般形式如下:

#if expression 1 Statement sequence 1 #elif expression 2 Statement sequence 2 #elif expression 3 Statement sequence 3 …

#elif expression n Statement sequence n #endif 5.2 #ifdef 和 #ifndef

条件编译的另一个方法是使用编译指令#ifdef和#ifndef,分别表示“如果已定义”和“如果未定义”。#ifdef的一般形式如下:

#ifdef macro-name Statement sequence #endif 如果macro-name原先已经被一个#define语句定义,则编译其中的代码块。#ifndef的一般形式是:

#ifndef macro-name Statement sequence #endif 如果macro-name当前未被#define语句定义,则编译其中的代码块。

我认为,用这种方法可以很方便的开启/关闭整个程序的某项特定功能。

?? #ifdef和#ifndef都可以使用#else或#elif语句。

#inlucde #define T 10 Int main(void){ #ifdef t Printf(“Hi Tn”);#else Printf(“Hi anyonen”);#endif #ifndef M Printf(“M Not Definedn”);#endif Return 0;} 6.#undef

#undef指令删除前面定义的宏名字。也就是说,它的意思是“不要已定义的某个宏”。一般形式为:

#undef macro-name 7.使用defined 除#ifdef之外,还有另外一种确定是否定义宏名字的方法,即可以将#if指令与defined编译时操作符一起使用。defined操作符的一般形式如下:

defined macro-name 如果macro-name是当前定义的,则表达式为真,否则为假。例如,确定宏MY是否定义,可以使用下列两种预处理命令之一:

#if defined MY 或

#ifdef MY 也可以在defined之前加上感叹号”!”来反转相应的条件。例如,只有在DEBUG未定义的情况下才编译。

#if!defined DEBUG Printf(“Final Version!n”);#endif 使用defined的一个原因是,它允许由#elif语句确定的宏名字存在。??? 8.#line #line指令改变__LINE__和__FILE__的内容。__LINE__和__FILE__都是编译程序中预定义的标识符(见11)。标识符__LINE__的内容是当前被编译代码行的行号,__FILE__的内容是当前被编译源文件的文件名。#line的一般形式是:

#line number “filename”

其中,number是正整数并变成__LINE__的新值;可选的“filename”是合法文件标识符并变成__FILE__的新值。#line主要用于调试和特殊应用。

9.#pragma

#pragma是编译程序实现时定义的指令,它允许由此向编译程序传入各种指令。例如,一个编译程序可能具有支持跟踪程序执行的选项,此时可以用#pragma语句选择该功能。编译程序忽略其不支持的#pragma选项。#pragma提高C源程序对编译程序的可移植性。

10.预处理操作符#和## 有两个预处理操作符:#和##,它们可以在#define中使用。

操作符#通常称为字符串化的操作符,它把其后的串变成用双引号包围的串。例如: #include #define mkstr(s)#s int main(void){ Printf(mkstr(I like C));Return 0;} 预处理程序把以下的语句: Printf(mkstr(I like C));变成

Printf(“I like C”);

操作符##把两个标记拼在一起,形成一个新标记。例如: #include #define concat(a,a)a##b int main(void){ Int xy = 10;Printf(“%d”,concat(x,y));Return 0;} 预处理程序把以下语句: Printf(“%d”,concat(x,y));变成

Printf(“%d”,xy);

操作符#和##主要作用是允许预处理程序对付某些特殊情况,多数程序中并不需要。11.预定义宏

C规范了5个固有的预定义宏,它们是: __LINE__:正在编译的程序的行号 __FILE__:正在编译的程序的文件名

__DATE__:代表源文件翻译成目标码的日期,形如month/day/year(月/日/年)__TIME__:代表源代码编译成目标码的时间,形如hour:minute:second(时:分:秒)__STDC__:如果__STDC__的内容是十进制常数1,则表示编译程序的实现符合标准C。

问:在程序的一行上可以出现多个有效的预处理命令行。预处理命令可以出现在函数的内部。给出的两段代码,有一段是错误的,哪段???

答:

第1段有问题。#ifndef WIN32 #endif printf(“OKn”);在这里,这个printf就不会被执行。也就是说,一行中,只能有一条预处理指令,当编译的预处理阶段,编译器识别了一条完整的预处理指令后,后面的所有东西他都不要了。

对于第二段,在函数里,我们是可以使用预处理指令的。比如:

void fun(void){ #ifdef WIN32...// 对于windows系统环境的操作 #else...// 对于windows以外的系统环境的操作

#endif /* WIN32 */...}

问:两个C语言的小问题(预处理命令)1.#define abc(x,y)(x)<(y)?(x):(y)main(){ int a=10,b=15,c;c=10*abc(a,b);printf(“%d”,c);} 我算出结果是100,可参考答案是15,不知是为什么? 2.#define A 5.5 #define B(x)A*x*x main(){ int a=1,b=2;;printf(“%f”,B(a+b));} 这个答案是9.5,这又是为何?

答:

1.c = 10*abc(a,b)= 10 *(x)<(y)?(x):(y)= 10 * 10 < 15 ? 10 : 15 = 100 < 15 ? 10 : 15 = 15 2.B(a+b)= A * a+b * a+b = 5.5 * 1 + 2 * 1 + 2 = 5.5 + 2 + 2 = 9.5

问:C语言预处理命令#define 选择题:以下程序的运行结果是?

#define MAX(A,B)(A)>(B)?(A):(B)#define PRINT(Y)printf(“Y=%dt”,Y)main(){ int a=1,b=2,c=3,d=4,t;t=MAX(a+b,c+d);PRINT(t);} A)Y=3 B)存在语法错误 C)Y=7 D)Y=0 请给我解释下PRINT(t);在宏展开是怎么表示的,答案是C。

答:宏处理的时候,一定要记住:直接代进去,任何多余的动作都不能有(别想当然地加括号!)。

还有记住一点的是在printf“"双括号里的是不能替代的话,所以这里的Y是输出形式。而不是字符常量Y的替代。这是一种特殊规定。

PRINT(t)=printf(”Y=%dt“,t);所以结果必将是Y=(一个值)又因为

MAX(a+b,c+d)(a+b)>(c+d)?(a+b):(c+d)的结果是7,所以,答案是“C)Y=7”。

问:求解:关于c语言中,宏定义的问题。。#define NLMSG_ALIGNTO 4 #define NLMSG_ALIGN(len)(((len)+ NLMSG_ALIGNTO1))这句编译没错,请问 NLMSG_ALIGNN(len)的值是多少

答: 1.第一句定义了一个符号常量,值为4。隐含的作用是指定地址对齐方式:按4边界对齐。

例如若某个对象的长度为18,那么在为其分配空间时,通过NLMSG_ALIGN宏就可以计算出最接近其的4的倍数为((18+4-1)& ~(3))= 20,这样便为其申请/分配20字节空间。

这是32位微控制器/微处理器中,为了防止非对齐操作产生Exception(异常)而添加的保护措施。

2.第二句定义了一个宏,宏体是一个表达式

3.NLMSG_ALIGNN(len)是宏调用,具体做法就是单纯地把字符用符号常量的值替换掉(宏展开)。宏展开的结果就是(((len)+ 41))。要说一下 &~,&是与运算,~是取反,都是对二进制”位"的操作。这里&~在一起,意思是“与3的非”。比如 5&~3 那么结果就是4(用2进制数表达就是:101&~011那么就是101&100,结果是2进制的100)。

问: 答:

问:

C语言中预处理 第3篇

【关键词】C语言;编程技巧;学习技巧;教学效果

前言:我国高校已经普遍开展C语言的学习,对培养知识经济时代下高素质、复合型人才起到了重要的推动作用。然而在实践过程中却发现,学生学习C语言的动力不足、掌握及运用能力较低,为C语言进一步发展蒙上了一层阴影。所以本文首先对C语言学习过程中的难点进行分析,随后探讨C语言编程技巧的应用内容,以为学生学习及课堂教学效果的提升提供帮助。

一、当前C语言学习难点

(一)函数的定义和应用

由于C语言是一门较为高级的计算机汇编语言,在学习过程中包含了大量的函数,而相应函数如何定义和使用成为当前学生学习的难点之所在。众所周知,C语言编程过程中往往会通过汇编语言来将函数功能在相应代码中实现[1]。然而,在实际运用及学习过程中经常会出现函数嵌套的事情发生,而产生该现象的原因则是在C语言编程过程中已經定义了一个函数,但是操作者并没有注意到此种情况,当使用不同定义的函数时,系统就会提示不能在函数体内定义函数。所以在C语言学习过程中关于函数的定于和使用是困扰学生的主要问题。

(二)编写程序的工整严谨性

运用C语言编写程序是当前知识经济时代下较为常用的程序编写方式,需要操作人员具有较强的逻辑思维能力以及编写水平,并且耐心要足够良好。编写程序主要是通过计算机检验来实现相应的功能,在编写过程中每一个细节问题都需要处理到位。一旦某个环节某个字母没有正确书写,那么将会导致编写的整段程序无法运行,降低了程序编写效率。而编程工整性和严谨性是考验每一个学生学习效果及能力的重要指标。但是对于当前大多数学生来说,编写程序仍然是一个难点问题,出错几率始终居高不下,导致学生在经过了很长时间学习后依然无法掌握正确的编写技巧,继而丧失了继续学习的兴趣和信心。所以C语言学习过程如何运用编程技巧来提高编写程序的工整严谨性成为当前亟待解决的问题。

二、C语言编程技巧在C语言学习中的应用

(一)指针技巧的掌握与运用

C语言编程技巧中指针是一个较为特殊的变量,在其中存储着大量的数值,可以被称作是内存地址之一。指针技巧可以通过分解来将各部分内容展现在学生面前,以促使学生明确指针的使用。当前C语言学习中指针由指针类型、指针指向类型、指针值、指针自身所占内存区所组成。指针类型是C语言学习及编程中最为常见的知识点,学生可以通过去除指针声明语句中所包含的指针名字来判断该指针类型,如:int*ptr、char*ptr,将指针名字ptr去掉后剩下的int*、char*即为指针类型。学生通过该技巧的使用可以在短时间内明确所有C语言指针的类型,为其应用提供了便利条件。指针指向类型相较于指针类型稍稍复杂一些,上例中去掉*后剩下的int、char等即为指针指向类型。所以指针技巧的掌握与运用主要在于学习者的耐心及细心程度,加强其主观重视程度后,学习C语言将会更加得心应手。

(二)C语言特有函数技巧的掌握于应用

C语言编程中函数的应用是实现特定功能的基础与前提,学生往往在函数的定义及使用过程中出现不同程度的问题,造成其学习效果不佳。因此,在C语言课堂教学中教师可以在函数定义所包含的名字、参数名称、类型以及函数返回值类型逐步分解并一一明确其各组成部分的功能,并且将独立的函数存储在编译系统数据库中,使用时输入#include指令即可将想要使用的头文件放入本文件中,使得C语言特有函数能够在短时间内被学生掌握及利用[2]。随着计算机技术快速发展,C语言特有函数的编写已经可以通过程序化步骤来实现,在方便了使用的同时,也降低了学生学习难度,使得C语言教学效果得到大幅提升。

(三)算法技巧的掌握与应用

算法是程序编写工作的重要组成部分,也是学习过程中花费时间较长的环节。为了能够提高学生学习效率,教师需要在课堂教学中将常用流程符号普及给学生,并且利用流程图来讲算法的应用逐一分解,向学生直观展示算法的应用。当前还可以利用自然语言来表示算法,同时与流程图讲解相结合,使得具备一定数学知识的学习者能够熟练掌握算法技巧,并运用在具体的程序编写工作中。C语言是建立在数学思想基础上的应用学科,数学思维在算法技巧掌握及应用中起到了重要的辅助所用。所以,在通过系统展示及分步讲解基础上拓展数学思维去寻找C语言程序编写规律,可以为其血气起到事半功倍的效果。

(四)位运算技巧的熟练掌握与应用

C语言之所以独立于其他计算机语言,就在于位运算使用。位运算是一种以二进制为对象、进行各种程序、数据、结果运算的一种基本算法。特别是在计算机文件中其应用更为频繁,掌握了位运算技巧,就相当于掌握了打开宝藏大门的钥匙。比如:数独时需要使用大量Hash表来统计九宫格里已经存在那些数据,如果在一个九宫格之中已经存在数字2和5,那么采用位运算后该九宫格可以使用数字18来表示;如果某一行或某一个九宫格为运算状态为511,则代表了该九宫格空间已满。要想改变其状态,只需要对其进行位操作,而省去了将数据重新转换成为二进制修改之后在转回来的步骤,使得整个C语言学习效率得到大幅提升[3]。

结论:综上所述,本文通过对当前C语言学习难点的分析得出了困扰学生的主要问题在于函数的定义及使用和编写程序的工整严谨性。并以此为依据提出了C语言编程技巧中指针、特有函数、算法、位运算等技巧熟练掌握是提高C语言学习效率的关键。希望通过本文的分析能够为我国高校改进C语言教学提供帮助,以促使C语言知识正迁移。

参考文献:

[1]段煅.C语言编程技巧在C语言学习中的应用[J].电脑编程技巧与维护,2010,12(20):150-151.

[2]余勍,王捷.浅谈C语言编程技巧在C语言学习中的应用[J].信息通信,2013,25(07):108.

C语言中预处理 第4篇

1.1 学生厌倦教材中的传统范例,多数以数学为主的刻板编程实例,无法调动学习积极性,没有主动编程的兴趣,从中感不到乐趣,所以不喜欢编程。

1.2 语句语法的剖析过多,实际编程的训练太少多数C语言教材中通常给出的语法要点很多,而对算法的构建和训练较少。导致学生在学习上走入误区,花大量精力在语法的熟悉和使用上,在实际编程中却无从下手,学了C语言课程却不会编程序,只会背语法。

1.3 同类作用的语法语句没有显著的区别实例,导致初学者认识混淆,不会区别使用。

2 解决的办法

2.1 从学生喜闻乐见的例子开始学习编程,让学生有新奇的感觉从最简单的C语言程序开始,引导学生自己动手演示程序。

2.1.1 屏幕输出想看到的图形如上课之初,可以在机房现场编一条在屏幕出现的欢迎语句,如"HELLO EVERY-BODY!"。

学生演示后发现:程序的运行结果一闪而过。有时根本看不到,就会提出问题;如何看到结果停留在屏幕上?于是再加一条语句,对这个程序进行改进如下:

这样就可以让想输出的图像、语句留在屏幕上了,可以引导学生举一反三,多联系几个例子,比如五角星、数字、汉字等,通过这些例子学会C语言的程序格式要求、输入输出语句使用等,达到初识C语言编程的目的,引起学生的兴趣。

2.1.2 动画程序利用C语言的画图和声音函数编写一段有图有声的程序,让学生看到他们经常上网看到的现象可以用C语言实现,任何前台的操作都是后台程序支持的结果,引导它们编程兴趣,同时讲解一些C语言的实际应用例子,让他们感到学习C语言后大有用武之地。

2.1.3 讲解C语言和其他语言的相互融合和互补,在现代较新较先进领域的应用实例,拓宽他们的视野。

2.2 先构建算法后学习编程

算法是程序的灵魂,是指导编程的思想,好的算法依托于结构清晰的框图,所以学编程前要教会学生构建算法的思路方法,以及可指导编程的程序框图的画法和技巧,要有强化训练,同时结合后序编程的实例有导向的和学生一起构建一些精品算法实例,用以指导后续的编程。要在后续的教学中始终有“将算法教学融入到语言教学中”的意识。

比如我们有意识的构建了以下几个问题的算法:

2.2.1 屏幕输出1到100的自然数中既能被3也能被5整除的数

2.2.2 学生成绩表统计

2.2.3 比较三个整数的大小,并按从大到小的顺序排列每个例子都和学生一起作出2到3个完整的算法框图,保留下来,待后面编程时针对每种算法都编写相应的程序,让学生自己比较体会哪个算法更简洁明了。

2.3 同类的语法语句找显著的实例区别对待

比如数据类型的定义、3种循环语句的区别对待、输入输出函数的区别对待、指针和指针的对象等编写简单程序,在容易出歧义的地方故意多做几个不同尝试,先教会学生简单调试程序的方法,然后在多媒体教室,采用单步执行程序,显示中间执行结果,跟踪函数内部执行过程等方法,让学生看到不同的语句执行后的不同结果和不同指向,加深他们对不同语句的理解和掌握,同时学会编程中的调试程序方法,而不是一有问题就交给老师,或者干脆放弃编程学习了。

3 不断尝试新的教学模式,把教学改革落到教学实践中

3.1 区别对待。在制定教学计划时要针对不同专业、不同起点的学生特点,选择不同的例题进行讲解和演示,以达到先期吸引学生的目的,同时排除由于学生的基础不同带来的学习编程的障碍。

3.2 启发式教学方法。通过各种教学方式和手段激发学生的学习欲望,使其在学习中积极思考,主动提出问题,并逐步解决问题。与学生一起探讨问题,启发他们学会思考,并在思考中解决问题,从而掌握独立分析问题、解决问题的方法。

3.3 采用项目教学法。师生共同实施一个完整的项目,通过对项目的系统分析,培养学生良好的编程习惯,善于获取他人经验的能力以及掌握综合运用所学知识的能力,从而完全了解项目流程,在项目实施过程中学习编程。学生以组为单位,通过完成一些难度稍大的主题作业,将语言知识和程序设计的内容串成两条相互呼应的主线,加深对语言的全面理解和掌握,培养综合应用语言的能力,提高编程水平。

3.4 提供开放的可演示的习题库和自我测试题库,供学生课后演练、检验学习效果,所有教学中的示例皆可以实时演示,加深理解巩固教学效果。

4 教学效果

从教学开始经过以上环节的增加趣味、吸引入门,到理清编程思路的程序实现过程学会构建算法,再到后面的步步深入完成编程,不知不觉中学生已经成为初级编程员了,学生会感到有成就感,主动探索编写身边相关问题的程序,让他们觉得编程不再是遥不可及的高深学问,而是通过学习和训练人人可以上手的一门有趣的实践学科。

5 课后思考

根据应用学科的特点,结合学校对学生的培养定位,考虑学生日后工作的知识需求和知识提升,如何在“以能力为核心”的课程理念下,使这门课程实现从面向编程思想的训练到面向编程技能训练的转变;如何使《C语言程序设计》真正成为学生感兴趣的、实用的课程,需要教师培养创新意识,探索教学改革的新思路、新模式,不断尝试不同的教学方法,逐步形成C语言的独有教学特色,让教师与学生在教与学中都感觉到成就感和学习的快乐,是我们追求的目标。

摘要:通过总结C语言教学实践,针对学生学习中出现的问题,提出了教学中几个关键问题的处理方法。希望在C语言课程教学方法改进方面做出有益的探索和创新。

关键词:算法,程序设计,项目教学法

参考文献

[1]谭浩强.C程序设计[M].北京:清华大学出版社,2001.

C语言中预处理 第5篇

理命令详解

作为一枚C/C++程序猿,在我们编写和查看C/C++源代码的过程中会遇到各种编译指令,这些指令称为预处理命令。预处理命令虽然不是C/C+的一部分,但却扩展了C程序的设计环境,下面传智播客C/C+培训专家将向大家介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。

ANSI标准定义的C语言所有预处理命令均以符号#开头,比如我写程序时常用的:

#define,#undef,#include,#if,#else,#elif,#endif,#ifdef,#ifndef, #error 1.#define和 #undef 宏定义命令的一般形式为:

#define[MacroName][MacroValue],示例如下: #defineITHEIMA 传智播客黑马程序员

在源程序中每次遇到ITHEIMA时,均以定义的值传智播客黑马程序员代换它。

 在使用该宏时,有以下几点注意事项:

 该语句没有分号。在标识符和串之间可以有任意个空格。 定义宏的时候,可以使用之前已经定义好的宏。

 如果串长于一行,可以在该行末尾用一反斜杠续行。

#defineLONG_STRING“good good study,day day up!”  在定义宏标识符时,字母一般需要大写。 预处理运算符的使用:

 #--该符号是“字符串化”的意思,出现在宏定义中的#是把跟在后面的参数转换成一个字符串

#define ERROR_LOG(module)

fprintf(stderr, “error: ”#module“n”)ERROR_LOG(“add”);转换为 fprintf(stderr,“error: ”add“n”);ERROR_LOG(devied =0);转换为 fprintf(stderr,“error: devied=0n”); ##--是连接符号,将多个串连接到一起。char *szStr = “传播播客_黑马程序员”;#define ITCAST(exp)cout <

2.#include 命令#i nclude使编译程序将另一源文件嵌入带有#include的源文件,被读入的源文件必须用双引号或尖括号括起来。例如:

#include“stdio.h”或者#include 这两行代码均使用C编译程序读入并编译用于处理磁盘文件库的子程序。将文件嵌入#i nclude命令中的文件内是可行的,这种方

式称为嵌套的嵌入文件,嵌套层次依赖于具体实现。

 如果显式路径名为文件标识符的一部分,则仅在那些子目录中搜索被嵌入文件。

例如: #include “../include/head.h”

 如果文件名用双引号括起来,则首先检索当前工作目录。如果未发现文件,则在命令行中说明的所有目录中搜索。如果仍未发现文件,则搜索实现时定义的标准目录。例如: include “head.h”

 如果文件名被尖括号括起来,则首先在编译命令行中的目录内检索。如果文件没找到,则检索标准目录,不检索当前工作目录。

例如: include 3.条件编译命令:#if、#else,#elif及#endif #define MAX 80 #include using namespace std;int main(){ #if MAX > 99 cout<<“MAX is bigger than 99”< #elif MAX > 90 cout<<“MAX is bigger than 90”< #else cout<<“MAX is smaller than 90”< #endif return 0;}  #if的一般含义是如果 #if后面的常量表达式为true,则编译

它与#endif之间的代码,否则跳过这些代码。命令#endif标识一个#if块的结束。

跟在#if后面的表达式在编译时求值,因此它必须仅含常量及已定义过的标识符,不可使用变量。表达式不许含有操作符sizeof(sizeof也是编译时求值)。

 #else命令的功能有点象C语言中的else;#else建立另一选择(在#if失败的情况下)。注意,#else属于#if块。

 #elif命令意义与ELSE IF 相同,它形成一个if else-if阶梯状语句,可进行多种编译选择。#elif 后跟一个常量表达式。如果表达式为true,则编译其后的代码块,不对其它#elif表达式进行测试。否则,顺序测试下一块。

4.#error 命令#error强迫编译程序停止编译,主要用于程序调试。该指令使预处理器发出一条错误消息,该消息包含指令中的文本.这条指令的目的就是在程序崩溃之前能够给出一定的信息。

5.#ifdef 和 #ifndef 条件编译的另一种方法是用#ifdef与#ifndef命令,它们分别表示“如果有定义”及“如果无定义”。# ifdef的一般形式是:

# ifdef macroname statement sequence

#endif #ifdef与#ifndef可以用于#if、#else,#elif语句中,但必须与一个#endif。

define MAX 91 #include using namespace std;

C语言教学中函数调用问题探讨 第6篇

关键词:函数调用 库函数 案例

1 函数调用问题的提出

本人在教学过程中,出现了多次这种问题。在讲授函数的概念、函数的定义和函数的调用之后,给学生出一道题目用函数来实现,通常情况下,该问题如果不用函数方法而用其他方法做的话,学生可能会做得出来,但让他们必须用自定义函数的方法来实现,他们就感觉无从下手,并不是这个问题本身很难,归根结底,学生对于怎么自定义函数,定义多少个参数,怎么在主调函数中调用自己定义的被调函数不知道如何做。从而导致了用函数解决的问题却用其他方法实现。在这里,我个人通过自己的反复思量,为了提高讲授函数调用的教学效果,自己总结了几条经验。

2 函数调用问题方法讨论

要知道函数怎么调用,首先得知道用户怎么定义函数。

2.1 函数定义的一般格式:

类型标识符[3] 函数名(形式参数列表)

{ 声明部分

语句部分

}

这个格式定义的函数为有参函数,“形式参数列表”中的参数被称为形参,有些函数是无参函数,则“形式参数列表”可以没有,但括弧不能省略,即无参函数。

函数在使用之前要先声明、定义,然后才能调用[1]。

2.2 函数调用的一般形式为:

函数名(实参表列)

函数在程序中出现的位置来分,可以有以下三种函数调用方式[2]:

①函数语句

把函数调用作为一个语句,这种方式不要求函数带回值,如打印图形、显示字符串等。只要函数完成一定的操作。

②函数表达式

函数出现在一个表达式中,这种表达式称为函数表达式。要求函数带回一个确定的值以参加表达式的运算。如:c=10*max(a,b),其中,函数max就是表达式的一部分。

③函数参数

函数调用作为一个函数的实参,如:printf(“%d”,max(a,b));是把max(a,b)作为printf函数的一个参数。

2.3 函数问题案例讲解

①首先从库函数的调用案例着手讲授,学生自然就很轻松上手。

众所周知,库函数中的数学函数学生从高中就经常接触到,在计算机教学的其他课程里面也会经常出现,如excel里面就有数学函数,学生们已经很熟悉了,如下面一道编程题就需要调用库函数解决。

用C语言求14+24+34+……94+104之和。

#include"math.h"

main()

{int n=10,k=4;

long y=0;

for(i=1;i<=n;i++)

y=y+pow(i,k);

printf("%d",y);

}

其中,pow(i,k)就是系统自带的数学函数,i和k是它自带的两个参数,其功能是计算i的k次方。通过这个系统数学函数的调用程序的编写及调试,学生们很轻松就知道库函数怎么调用,即函数名加上函数括号里面的参数。

另外大家使用库函数的时候,一定要在本文件开头用#include命令,将调用有关库函数时所需用到的信息“包含”到本文件中来。该程序开头用语句# include"math.h",即可将数学库函数“包含”到主函数中来。

②用大家熟悉且简短的函数编程案例入手讲解。

典型小案例教学具有很强的启发性,既有利于学生学习,也有利于老师教授。

用C语言函数实现1+2+3+……+20之和。

long fnsum(int n)

{int i;

long y=0;

{for(i=1;i<=n;i++)

y=y+i;}

return y;

}

main()

{

int n=20;

printf("%d",fnsum(n));

}

在这个程序代码中,程序行long fnsum(int n)是自定义函数,fnsum是函数名,n是定义的一个形参,也仅需要一个,表示1+2+……+20共有多少个数求和。由于fnsum函数代码写在main()函数之前,可以不进行声明。反之,若fnsum函数代码写在main()函数之后,必须用代码long fnsum(int n);进行声明。fnsum函数功能即是题目要完成的功能实现,最后通过main()主函数定义一个实参n并赋值20,在printf函数中通过代码printf("%d",fnsum(n)),调用了自定义函数fnsum,并将实参n=20传递给自定义函数fnsum(int n)中的形参n,最终将结果打印输出。

在main()主函数中,fnsum这个函数调用也可以改成如下:

main()

{

int n=20,sum;

sum=fnsum(n);

printf("%d",sum);

}

這个是通过函数表达式的方法进行函数调用,通过这个自定义函数的简单案例讲解,学生很轻松能够理解函数怎么自定义并在main()主函数中调用。

3 结束语

本文分析了C语言函数调用学习过程中存在的问题,在今后的教学过程中,本人将进一步努力提升自己,希望能总结出更多更好的方法来改进函数教学方法,使学生能够更轻松地上手学习。

参考文献:

[1]汪明光.C++语言中函数指针的分析与应用[J].巢湖学院学报,2006,8(3):30-34.

[2]谭浩强.C语言程序设计(第三版)[M].北京:清华大学出版社,2005.143-150.

C语言中预处理 第7篇

在日常工作学习和生活中, 我们使用计算机所进行的一切行为活动, 都是通过编程来完成的。在编程语言的应用方面, 计算机使用到的既有高级语言也有低级语言。而C语言则是融合了上述两者的优势而形成了一种非常重要的计算机语言形式。运用C语言, 可以实现对计算机用用软件以及硬件中的系统软件的编写。C语言的应用领域和范围十分广阔, 因此, 也成了计算机语言学习中一门不可或缺的课程。

1 C语言的基本特点

1.1 操作简单, 功能强大

同其他类别的计算机语言相比, C语言显得非常紧凑, 在使用操作时也比较简单, 语法限制相对不是很严格。编程人员在书写时, 也很自由, 融合了计算机低级语言和高级语言综合优势的C语言功能也非常强大。

1.2 应用可植性强, 应用对象面广

C语言在实际使用过程中, 其面对的对象非常广泛, 具有很强的可植性。计算机的绝大部分操作系统, 都能够运用大C语言编程。C语言自身包含的运算符较多, 能够满足大多数编程的实际需要, 并且运算符的运用也比较灵活, 难度不高。在计算机编程语言领域, C语言可以称得上是最为高效的编程语言。

1.3 具有丰富的数据结构

C语言包含了众多的数据结构, 这些数据结构的自身特点也非常丰富。由于这些特点, 使得C语言在顺利完成各种复杂运算的同时, 还兼具了强大的图像处理能力。另外, C语言的结构式, 还可以对代码以及数据进行有效分割处理, 使得编程程序层次清晰, 操作十分简单, 在后期的维护工作中, 也比较方便。

2 C语言学习困难的原因

2.1 逻辑抽象复杂

C语言的特点使得其在计算机语言学习中, 占有相当重要的位置。不过由于其自身内容的复杂性, 以及形式逻辑的抽象, 导致很多学习者学习起来非常困难。

2.2 编程语言枯燥乏味

C语言编程枯燥乏味, 让很多人在学习过程中失去兴趣。学习者很难掌握C语言的技巧以及知识重点, 在似懂非懂的学习一定课程内容后, 导致思维混乱, 知识结构不清晰, 达不到学以致用的效果。枯燥的字符, 使得学习者不能产生学习兴趣。C语言本身同普通的编程语言差别较大, 不能呈现立体的画面, 影响逻辑思维的展开。

2.3 记忆难度大

学习C语言知识时, 一些实际的编写程序, 看似简单, 但是在编写时如果稍微一不注意, 就会使得整个编程出现重大缺陷, 很多语言结构都是强调背熟记牢的, 这对于学习者记忆力的要求非常高, 数据结构以及算法知识, 记忆的难度非常大。

3 C语言编程技巧在C语言学习中的应用

(1) 指针的掌握。在学习c语言知识过程中, 掌握好指针, 可以打好基础, 根据一些学习者反馈的情况, 指针的学习要重点记忆, 在理解其要素类型的基础上, 记在脑海。指针可以理解为一种计算机语言知识的特殊变量, 这个变量包含有如下三种要素:指针名、指针类型、值。指针名其实就是和普通变量没有区别的一种变量, 不过其指针的类型以及值, 存在一定的特殊性。指针知识, 是C语言课程中非常重点而又基础的内容, 掌握好指针, 对于后续更加复杂的语言知识学习, 才能得心应手。学习者通过学习指针, 能够找到语言知识中一些解决复杂问题的方式和方法, 并对语言知识进行有效表达, 然后熟练的运用相关数组知识, 结合数学函数, 逐渐建立起c语言知识学习的逻辑思维。

(2) 特有函数的掌握。在实际的编程过程中, 必不可少的需要对C语言中特有的函数进行调用, C语言中的函数并不是我们所谓的数学函数, 它代表的是一种功能, 当我们每调用一个具有固定功能的函数时, 它代表的功能就会实现。在给函数进行定义时, 必须包含以下几个要素:函数名、参数名、参数名类型和函数返回值类型, 系统之前就已经对函数进行了定义, 当我们需要使用时, 只要输入#include指令, 将有关的头文件包含在本文件中即可。

(3) 算法技巧的掌握。编程主要是通过各种算法来实现的, 算法既是最重要的内容, 同时也是最难掌握的部分。算法有两种表现形式:一种是自然语言表示, 另一种是相应流程图表示。如果需要用到流程图, 学习者一定要将一些常用的历程符号熟练掌握, 如果学习者的数学基础较好, 并且对数字有较强的理解能力, 在学习算法时就比较简单。算法技巧掌握之后, 要求学习者进行相应的上机练习, 及时消化和加深对算法知识的理解, 锻炼计算机语言知识的变化和应用能力。

(4) 位运算以及文件知识的掌握。在C语言下编程, 其特色就在位运算, 位运算是在其它任何一种编程语言中都不具备的, 这也意味着, 位运算的重要性和难度, 位运算主要是以二进制为对象, 进行比如:位与、按位以及取反等各种运算。除此之外, 在计算机之间一个必不可少的部分就是文件, 文件的体现形式有两种:一种是程序文件, 另一种是数据文件, 通过文件, 利于编程人员快速查找到需要的数据, 节省了查找时间, 进而提高了编程效率。高效率的编程, 是计算机语言知识学习的基本目标之一, 因此, 要掌握好位运算的基本技巧和方法, 更加熟练的运用相关文件知识, 在反复运算中, 找到更加有效的技术方法, 提高编写技能。

4 结语

C语言知识是现代计算领域重点的基础知识, 虽然其内容复杂, 学习难度较大, 但是, 在实际学习过程中, 仍然有一些适当的方法和技巧可以降低学习难度, 提高学习效率。在正式学习C语言之前, 学习者要对C语言进行一定的了解, 比如上文提到的特有函数、算法、位运算等等, 只有掌握了一些特殊技巧, 才能提高学习者的学习兴趣, 快速进入到学习状态, 从而提高学习效率和学习质量。

摘要:由于C语言的一些独特优势, 使得其逐渐成为计算机编程领域的主要语言。但是, 对于很多学习者来说, C语言学习过程中, 还是存在不少难点, 很难掌握, 影响了C语言学习的质量和效果。基于此, 本文在对C语言进行综合论述的基础上, 结合实际学习中的问题, 提出了关于C语言编程技巧的应用方法, 希望可以帮助学习者尽快熟悉C语言学习的模式, 提高对C语言的掌握水平。

关键词:计算机语言,C语言,编程技巧,高级语言,数据结构,算法技巧

参考文献

[1]赵黎, 范君君.C语言编程技巧在C语言学习中的应用研究[J].信息与电脑 (理论版) , 2014 (09) .

[2]张奎, 李丙春.流媒体技术在精品课程网站中的应用[J].新疆师范大学学报 (自然科学版) , 2014 (03) :70-74.

C语言中预处理 第8篇

关键词:C语言,C语言编程技巧,应用

C语言是一种程序设计语言, 在数据处理方面功能强大, 在很多领域都得到广泛应用, 如软件开发领域、科研工作等, 都与C语言密不可分, 具体应用主要有单片机和嵌入式系统的研发。C语言编程即是借助C语言编写相应的程序代码, 去解决问题, 其原理是将人的想法输入计算机, 使计算机按所设置的指令完成工作, 计算机编程语言可分为三类, 一是机器语言, 二是汇编语言, 三是高级语言, 后两者是目前最为最为常用的两种语言。学习C语言编程, 掌握一定的技巧, 能够很好地促进C语言的学习。

1 C语言的优缺点

由于高级语言较为复杂, 有些运算不容易实现, 但C语言有30多种运算符, 且使用起来灵活方便, 能够很好地解决这一问题;不但运算方便, 在书写C语言的程序时, 形式较为自由, 所以表达方式更为多样;在对较复杂的数据结构进行运算时, 难度很大, 而C语言具有多样化的数据类型, 适合复杂的运算, 尤其是指针概念以来, 提升了程序的工作效率;和C语言相应的C编译程序, 多具有公共性质, 方便移植, 即编写好的程序在两个不同环境中均可运行;在对问题的描述上, 和汇编语言相比, C语言工作量少, 描述快捷, 且效率高, 其代码质量也和汇编语言相近。

C语言的缺点主要表现在两方面:1) 程序的安全性, 主要是因为书写形式太过自由, 语法限制不够严格, 约束少;2) 数据的封装性上, 这是区别C和C++的方法之一。

2 C语言编程技巧

虽然C语言有以上诸多优势, 但学习起来难度很大, 具备一定的编程经验和技巧, 既有利于编程效率的提升, 又能更好地学习C语言。编程技巧有很多, 简单介绍两种:1) 指针。C语言的自由多是通过指针表达出来的, 指针的语句简单, 但作用重大, 有利于提升C语言的运算速度, 不足之处就是占用的内存过大;2) 数学方法。数学计算在计算机中是必不可少的, 在学习C语言时, 也必然碰到大量的数据结构。编程多是为了解决问题, 以计算机代替人执行繁重的运算工作, 节约人力资源, 而一些简单的运算可在数学领域解决。因此, 在进行程序编写之前, 可以将数学思维贯穿其中, 提升工作效率, 拓展工作人员的思维;3) 位操作有利于提高C语言的效率, 因为“位”是所有计算机程序中的最小数据单位, 意义重大, 能够使代码变得更为简洁, 效率更进一步, 所有的运算操作几乎都要依据“位运算”解决, 但位操作可能会带来安全隐患。至于其使用技巧, 应根据实际情况做具体考虑。

3 单片机C语言编程技巧

单片机成为产品开发的必然选择, 其计算操作工作越来越复杂繁重, 相应的自身性能也得到了提升, 内部存储器不断扩大, 无论是代码量, 还是运行速度, 都和汇编语言相差无几, C语言在其嵌入式系统中被广泛应用, 作为其编程语言。C语言优势固然众多, 稍有欠缺之处在于所生成的代码过长, 除非编程技术较为高强, 否则效果还不如汇编语言, 因此须知, 单片机C语言和普通的C语言是有差别的。下面介绍几个关于单片机的编程技巧。

3.1 选择数据类型

单片机C语言编程需要结合程序存储器资源, 能够提供相当多的数据类型, 其中, 可以被机器语言直接读取的只有两种, 一是bit, 二是char, 这两类所生成的代码较短。相比之下, 浮点型、整型等数据类型不能被机器本身直接读取, 需要借助相关程序或函数的支持, 这类数据生成的代码较长。某些程序表面很简单, 实际编译却很复杂, 所生成的代码也比较长。为减短代码长度, 在选择数据类型时, 需根据实际情况具体选择。

3.2 算法优化

确定数据库类型后, 需对程序算法进行优化, 主要针对两个对象, 一是程序运行速度, 即时间复杂度;二是程序代码量, 即空间复杂度。两者通常是相互独立的, 具有此消彼长的关系, 如空间复杂度有所改善, 则时间复杂度就会相应的增加。因此, 对其优化应按照具体情况去平均值。两者的性能评估, 往往由开发人员自行评估。代码效率是指代码被发出使用到返回所花费的时间, 优化时间复杂度, 主要依靠代码的执行时间, 计算其执行时间, 可通过计时器完成, 将单片机自身的计时器的方式调成自动重载形式, 调用代码时, 需开启计时器, 执行完成后, 及时停止。以此计算时间, 进而优化。此外, 也可通过示波器来完成。

3.3 数据存储器的分配

单片机的内部数据存储器RAM容量较小, 往往只有几百字节, 随着数据信息的增多, 必须扩展其存储空间。其实要存储更多的数据, 可通过拓展外部存储器来实现, 但如此, 一来要花费更多的硬件成本, 系统也会更加复杂, 二来外部存储器的代码较长, 因此, 必须合理分配内部存储空间, 提升利用率。内部存储器RAM空间有限, 但包括许多内容, 如库函数、内部处理器、所有程序变量及压缩栈等。C语言采取的是存储器的覆盖技术, 覆盖技术即是指当某个程序停止使用时, 其空间可以提供给另外的正在使用的程序使用, 此程序结束时, 再传给下一个程序使用, 这样可节省大量空间。需注意的是, 能够被释放提供空间的只有局部变量中的动态变量, 全局变量或静态变量都无此功能。因此, 在设计程序应该采取动态变量, 以提高内存使用。在C语言中, 参数之间的传递是由内部寄存器负责的, 寄存器一旦空间不够, 势必会给程序造成极大的不利影响。如生成的语句过长, 必会占据很大空间, 可将其分作几段, 减少中间变量, 从而保护程序。

4 结束语

C语言以其强大的功能和诸多优势在众多领域被广泛应用, 在各高校, 尤其是理工科更是大力发展。C语言是面向过程的编程语言, 算法以及数据结尤为关键, 也是学习的难点。为解决这一难题, 可学习一定的编程技巧, 编程技巧能够提升学习兴趣, 而且目的也较明确, 可通过此来提升学习效率,

参考文献

C语言中“链表”教学探讨 第9篇

1 链表的概念

链表如同一条铁链一样,环环相扣。可以将物理上不相邻的存储单元变成在逻辑上相邻的两个元素。而链表中最重要的要素就是“节点”,一个节点至少包括两个域:一个域用来存放需要运算的实际数据,称为数据域;另一个域中存放下一个节点的地址,称为指针域。一个链表一般还有一个头指针,存放第一个节点的地址,链表最后一个节点的指针域为空。图1表示单向链表的结构,图2是一个单链表实例。

2 链表的分类

单链表实现的功能是有限的,为了解决更多实际问题,链表还有循环链表和双向链表两种形式。

2.1 循环链表

单向链表中第一个节点,只能通过头指针来进行访问,这有一定的局限性。如果把单链表中的首节点和尾节点相连接,则从链表中任一结点出发,都能访问到链表中所有的结点,这就是循环链表。如图3。

2.2 双向链表

在某些情况下,我们不仅需要记录后继节点的地址,还需要记录前驱节点的地址,这就需要在定义链表的节点时定义两个指针域分别来存放前驱节点地址和后继节点地址,这样的链表称为双向链表。双向链表又分为简单双向链表和双向循环链表。简单双向链表的结构如图4。

3 链表的基本操作

链表的基本操作包括链表的建立、链表的输出、链表的插入、链表的删除等。

3.1 链表的插入

将一个节点插入到已有的链表中。假如要求在单向链表的第i个元素之后插入元素。

a)令q指向新开辟内存单元(链表新节点),读入数据存入新节点中。

b)找到欲插入节点X,令p=X->next,并令X->next=q,q->next=p;即完成节点插入操作。

3.2 链表的删除

删除链表中的某个节点。

a)从头结点开始,比较每个结点值是否等于要删除节点,找到后将该节点当一个节点地址存入p。

b)令p->next=p->next->next,并释放p指向的节点,即完成删除操作。

4 链表的应用——用链表实现大数阶乘

使用链表可以解决很多实际问题。C语言中提供了多种数据类型和运算符,可以进行多种运算,但由于各种类型变量存放数据的范围是有限的,在进行一些比较大的数据的运算时可能导致计算结果不准确,甚至是出现溢出错误,所以在C语言中进行大数运算时使用普通数据类型和变量是无法完成的。此时我们可以考虑通过链表结构实现大数运算。下面本文以大数阶乘运算为例说明链表的应用。

C语言提供给的能够表示最大范围的整数类型是长整形,它最多也只能求12!,即使使用long double类型的变量存储某个数的阶乘值,它准确求得的阶乘也是有限的。想求一个大数的阶乘,仅使用C语言中的基本数据类型是实现不了的。我们可以用双向链表来解决这个问题。

4.1 大数阶乘算法思想

通常阶乘计算的方法是利用循环,代码如下:for(i=1,p=1;i<=n,i++)p*=i;

p中即可得到阶乘结果。

但变量p能够表示的范围有限,无法计算大数阶乘,可以用链表实现。计算过程中将每一步计算结果存入链表中,并且规定每个节点内存放的数据范围,超出该范围的需要进位并创建新的节点来存放。

计算大数阶乘时每一步乘法运算都得到一个计算结果,我们将此结果存入链表中,若该结果大于999则存入链表的两个节点中,若小于999则存入链表的一个节点中。当进行到第i步运算时,假设此时链表中有m个节点,计算方法为:首先计算i与第一个节点相乘得x,若x大于999则产生进位,并将x与第二个节点相乘结果加上该进位,再次判断处理,直到所有节点都与i计算完毕,链表中即存放了第i步阶乘计算结果。

4.2 定义相关数据结构

本文中所用链表中的数据域中存放阶乘结果的部分数据,所以数据域定义为整型。当计算完毕后还要按顺序输出每个节点中的数据,即链表需要正反两个方向使用,所以采用双向链表实现。结构体定义如下:

其中指针变量pre是指向前驱节点的指针,指针变量next是指向后继节点的指针,data是节点中存储的数据。链表中每个节点用以表示0~999之间的三位数(可以理解成每个节点用以存放1000进制数,超过这个数,则需要进位)。

4.3 大数阶乘算法实现步骤

假设已定义n,要求用户输入n值,求解n阶乘。并将结果存入head指向的双向链表中。

1)根据程序要求,输入数据n。

2)计算n阶乘

a)建立一个节点来存放阶乘值的初值1。其前驱指针和后继指针都设置为NULL。并使head指向该节点。代码为:

b)i从0到n循环计算n阶乘。当计算至第i步时,假定此时有m个节点。

从1到m节点,i乘第j个节点得x,若x<999,x存入j节点,否则将x%1000存入j节点并将x/1000作为进位存入第j+1节点。

例如:在循环过程中,计算至7*6!时,6!值为720,占用一个节点,当计算7*720时得5040,大于999,超出范围,需要进位,进位为5040/1000=5,即进位为5存入新开辟节点,余数40存入本节点中。

反复执行上述过程,当最高位的节点值需要产生进位时,则开辟新节点来存储进位,否则不需要重新开辟节点。并将head指向新开辟节点。

c)把链表的头指针head返回给主调函数。

3)输出计算结果。

计算完成后要计算得到的阶乘值,此时输出结果应为链表中各个节点值的顺序排列(按产生顺序的逆序输出)。根据主调函数传递过来的头指针找到链表,输出节点数据域中的数据,并判断next指针域是否为空,若空链表输出结束,非空时指向下一个节点。

结果输出过程中需注意,链表中每个节点值范围为0-999,高位如果为0,在用函数print(“%d”,p->data);输出时,无法显示0,只显示有效数字。所以输出时应注意在高位为0的节点中填充0。可以根据节点中的数据大小来确定填充0的个数。

例如if(p->data/10<0)printf("00%u",p->data);。

4.4 主要实现代码

其中,指针变量q指向新建节点。flag为标记变量,标记是否有前驱节点,如果有flag==1,即表示还有高位节点等待计算,如果有flag==0,则表示此节点即为最高位的节点。

5 总结

本文介绍了C语言中链表的概念,并介绍了链表分类及基本操作,此部分内容在教学中比较枯燥,属教学难点,本文给出了链表在实际问题中的应用实例,利用双向链表解决了大数阶乘运算问题,在此基础上我们可以将链表应用于大数的其他运算。

参考文献

[1]谭浩强.C语言程序设计[M]3版).北京:清华大学出版社,2005.

[2]曾联明.用C语言链表解决大整数运算的精度问题[J].电脑学习,2002.

[3]闫冰一,李晔,郑丽萍.C语言多重指针在二叉链表操作中的应用[J].郑州工业高等专科学校学报,2002.

[4]落常明.多维链表的实现及操作算法研究[J].科技情报开发与经济,2007.

C语言中常见错误分析 第10篇

1 C语言使用中常见的错误

1.1 大小写错误

C语言规定所有的标识符是区分大小写的;所有的关键字必须为小写。如:sum与SUM就是不同的标识符。

1.2 用户自定义标识符的中错误

在C语言中规定,用户自定义的标识符可以用来区分变量、符号常量、函数名、数组、类型等数据对象,只能由数字、字母、下划线组成且第一个字符必须是字母或者下划线。用户自定义的标识符不能与关键字相同。许多学生在使用过程中经常忘记这一规定。如定义一个整型变量:int char;错误之处在于将关键字char定义为用户标识符,这是不允许的。

1.3 使用未定义的变量或者变量使用前未赋值

main(){int a,b=3;printf(“a=%d,b=%d,c=%dn”,a,b,c);}

此例中,会得到如下的错误提示:error C2065:'c':undeclared identifier执行cl.exe时出错。出错原因在于变量c在使用前未定义。

定义变量c之后的程序如下:

main(){int a,b=3,c=4;printf(“a=%d,b=%d,c=%dn”,a,b,c);}

程序运行时并没出现语法错误,运行结果为:a=-858993460,b=3,c=4

从本例可以看出,在定义变量a,b,c的同时,仅完成了对变量b、c的初始化,变量a在使用之前未被赋值,因而得到a=-858993460的结果。此结果的得出是由分配给变量a的内存空间里的数据经转化得到。这个数值是随机值,由分配给a的内存空间里的数值决定。此类错误为逻辑错误,不易察觉。程序可以修改为:

main(){int a=2,b=3,c=4;printf(“a=%d,b=%d,c=%dn”,a,b,c);}

运行结果为:a=2,b=3,c=4

1.4 混淆“=”与“==”

在C语言中,“=”是赋值运算符,表示将“=”右边的值赋给左端的变量,不能做等号使用。“==”才是表示两个数据是否相等的关系运算符。“==”的优先级比“=”高。

例如:

main(){int a=0,b=1;if(a=b)printf(“a=%d”,a);}

输出结果:a=1

分析:执行if语句时,无论a原来为何值,都被b的值所取代,a值变为1。所以表达式“a=b”的结果永远为非零,if语句执行,输出结果a=1。

要表示a与b比较的关系,则程序改为:

main(){int a=0,b=1;if(a==b)printf(“a=%d”,a);}

只有当a和b的值相等时,if语句才执行,输出a的值;否则,if语句结束。

1.5 使用逻辑运算符常出现的错误

逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。有以下的程序段:

int a=1,b=2,c=3,d=4,m=1,n=1;执行完语句“(m=a>b)&&(n=c>d);”后,m和n的值分别为0和1。a>b的结果为0,因而m的值变为0。运算符“&&”的第一个运算对象为0(即为假),所以不管右端的表达式(n=c>d)的值为何,逻辑与的结果都为0。因而(n=c>d)是不必运算的,所以n保持原值1,而不是0。

同理:int a=1,b=2,c=3,d=4,m=1,n=1;执行完语句“(m=ad);”后,m和n的值分别为1和1,n保持原值不变。

1.6 对复合语句忘记加花括号“{}”

有以下程序段:

程序本意是要执行1+2+...+10,但while语句却是一个死循环。原因是循环语句中的循环体应是由花括号“{}”括起来的一个复合语句。由于在while语句中循环体少了花括号,则循环体仅由一个语句构成,即sum=sum+i;而语句i++;则是循环语句的下一条语句,不再是循环体中的语句。由于起循环控制作用的变量i的值始终未被改变,因此构成死循环。根据题意,应将该程序段中的while语句修改为以下形式:

1.7 用scanf()函数输入变量值时的错误

1.7.1 漏写取地址运算符“&”

如:int a;scanf(“%d”,a);/*a前漏写&*/

C语言中,scanf()函数的输入项必须用地址表示,作用是按照a在内存的地址将输入的数值存入。

1.7.2 输入普通字符也应输入

例如有程序段:int a;scanf(“a=%d”,&a);从键盘输入数值,使a为10。则正确的输入形式应该为:a=10《回车》

如果忘记输入普通字符“a=”,变量a将不会得到正确数值10。

1.8 忽略某些函数的求值顺序

如:main()

运行结果为:99,99,99,100

这是由于在Turbo c中执行printf()函数时,参数是按照从右到左的顺序被压入栈中的,即先压入x,在压入—x,然后x,最后是x++。弹出时依次为:x++,x,--x,x。因而得到上述结果。

1.9 switch语句中缺少break语句

例:int day;scanf(“%d”,&day);

程序本意是根据变量day的取值(1,2或3),分别打印出Monday,Tuesday,Wednesday否则打印input error。

如果输入day的值为1,打印结果是MondayTuesdayWednesdayinput error而不是我们想象中的Monday。导致此结果原因在于:在执行第一个printf()函数调用语句之后,程序继续执行接下来的三个printf()函数调用语句。这种情况的产生是由于在switch语句中缺少break语句所造成。将上述程序段改为以下形式:

1.1 0 使用数组时,数组下标越界

有以下程序:

程序的本意是将数组a中的十个元素分别赋值为0,1,…,9。但是却把比较部分写成了“i<=10”,数组元素从a[0]开始,a[10]这个元素是不存在的。正确的形式为:

1.1 1 混淆字符和字符串的表示形式

如:char ch=“A”;是错误的。‘A’和“A”是完全不同的常量,‘A’是字符常量,在内存中占一个字节,它可以赋值给字符变量;而“A”是字符串常量,它包括两个字符:‘A’和‘�’,在内存中占二个字节。无法存放在字符变量中,C语言没有字符串变量,使用字符型数组来存放和处理字符串。如:char c[10]=“welcome”;

1.1 2 使用未初始化的指针

指针变量是C语言中的一个特殊类型的变量,用于存放变量的地址。指针变量定义后应确定其指向。在没有确定指针的具体指向前,指针变量的内容是随机的地址,盲目地引用将十分危险。例如:下列程序用于比较两个数的大小,并在主函数中由小到大输出结果。

swap函数的功能是以*P为中间变量,实现指针pl,p2所指单元内容互换。P只是定义却没有具体指向。当swap函数被调用时,系统仅给指针p分配一个内存单元,而这一内存里存放的地址未定。它可能是操作系统或其它用户区的某一内存地址,当运行程序时,很可能使不属于本程序的某个内存内容被修改,从而造成整个系统的崩溃。swap函数正确的形式为:

1.1 3 指针变量所指向的变量类型与其定义的类型不符

定义指针变量的一般格式为:类型说明符*指针变量名;其中“类型说明符”规定的是指针变量所指向的变量的类型。C语言规定一个指针变量只能指向同一类型的变量。如:

f类型是单精度实型的,而指针p是指向整型变量的指针,f与*p数据类型不符。不符合C语言的语法。应该为:float*p;

1.1 4 在数组使用指针变量时的常见错误

程序如下:

main(){int a[10];int b[3][4];int*c[10];int(*d)[5];int*p;}

1)a为一维数组名,有类似一级指针的性质,a为数组中首元素a[0]的地址,*a为int型数据。

2)b为二维数组名,有类似二级指针的性质,*b为元素b[0][0]的地址(即b[0]),**b为int型数据。

3)c为一维数组名,有类似一级指针的性质,且又是指针数组,故c有类似二级指针性质,*c为地址,**c为int型数据。

4)d是一个指向含有5个整型数据的一维数组的指针变量,故d有类似二级指针的性质,*d为地址,**d为int型数据。

按照上述解释,若有语句“p=b;”则是错误的。虽然p是int型指针,二维数组b也是int型,但p是一级指针,而b是一个二维数组,是二级指针,编译时系统报错。正确的写法是:p=b[0]。

2 结束语

上述列举的一些错误,是初学者在编程中经常遇到的错误。当然在学习中还会碰到其它一些不容忽视的错误,需具体情况具体分析并认真总结。只有这样才能消除这些常见错误,提高编程水平。

摘要:C语言是许多高校开设的第一门程序设计语言,使用方便灵活。根据C语言的特点,并结合实际教学,对在编程中经常遇到的错误进行分析、总结,为初学者尽快掌握C语言,提高程序设计水平提供借鉴。

关键词:C语言,常见错误,逻辑错误,指针,变量

参考文献

[1]谭浩强.C程序设计[M].3版.北京:清华大学出版社,2005.

[2]陈友明.C语言使用中常见错误分析[J].电脑知识与技术,2006(1).

C语言教学中的几点改进建议 第11篇

关键词:兴趣;教学手段;教学内容;作业布置;考核方式

中图分类号:C41文献标识码:A文章编号:1007-9599 (2010) 09-0000-01

Suggestions on the Improvement of C language Teaching

Yang Jinghua1,Li Huazhong1,Wang Yufang2

(1.Huayu College of Henan Agricultural University,Shangqiu476006,China;2.Xi'an Communication Institute,Xi'an710106,China)

Abstract:According to recent years’teaching experience,found out that there are several common problems existing in the current C language teaching.So this paper will work out solutions to those problems on the following aspects:stimulation of students’interest,teaching methods,teaching content,assignments and finally methods of assessment.Therefore teachers’teaching effect and students’learning ability will be improved.

Keywords:Interest;Teaching methods;Teaching content;Assignments;Methods of assessment

眾所周知,C语言是高等院校计算机相关专业的一门必修课,也是非计算机专业的基础课。C语言功能强大,使用灵活,但规则繁多,容易出错,教师教学和学生学习都感到不同程度的困难,笔者根据多年的教学实践和深入学习,就现在教学环节中出现的问题谈几点改进建议。

一、培养兴趣

兴趣是最好的老师,初步接触C语言的学生都能感到程序设计的神秘,但随着大量规则和概念的不断出现使学生感到枯燥乏味,由原来的好奇转为敬而远之。兴趣是能对学习产生积极反应。如何激发学生学习兴趣尤为关键。在教学中笔者这样引入第一节课:计算器是如何计算复杂数据的?扫雷游戏是怎么完成的?无人驾驶汽车是如何判断行进方向的?等等。由问题入手,把枯燥的规则定式转变为生活中的常例,一方面易于理解,另一方面也是最主要的可以激发学生的学习兴趣。

二、教学手段的改进

目前在C语言教学中,多媒体教学的使用极大提高了教学效果。初编好的程序要经过不断的调试,教师通过投影仪演示对程序查错、纠错的过程,这种直观的方法很容易让学生理解并掌握。但在实际的教学实践中存在过分依赖多媒体资源的现象,须用板书讲解、分析的内容仅对着屏幕做简要讲解。笔者认为板书设计在某种程度上的作用是其它教学工具不可替代的。例如:讲到第二章算法时(以清华大学出版社出版谭浩强教授编著的《C程序设计》为例),分析算法和程序执行流程等内容就适合板书讲解,它可使学生的思路与老师保持一致。所以在教学中既重视多媒体的作用又利用传统教学的优势,将二者合理结合,充分发挥各自优势,提高教学质量。

三、教学内容的改进

对教学内容应本着“循序渐进,由简到难”的指导思想。故笔者将课本内容做了调整,第一章只做简要讲解,使学生对程序有个印象,因学生初步接触到程序设计还不能明白程序设计的灵魂,故笔者把第三章放在第二章前讲解,这样学生学习起来较容易,又可增强学生学好C语言的自信心,而后再回过头来看第一章的三个例子,会感觉容易许多,学生的积极性又一次被激发,更有利于数组和指针的学习。对于程序的理解,可以先给学生讲一个完整的程序(以例1.3为例),告诉学生程序是由函数构成的,main和max都是函数,而函数是由语句组成的,让学生对C程序有更深刻的理解,把程序设计的步骤、方法和思想作为整个教学过程的重点,培养学生分析问题、解决问题的能力。

四、作业布置方面的改进

有的老师布置作业时,总是指定课后作业第几题、第几题。笔者认为,在布置作业时应以能提高学生的动手能力为根本,也应由浅入深,适应不同程度的学生的练习,因为学习这门课,学生之间的差异很大,有的学生学习兴趣浓厚,但也不可避免个别学生落队,所以在布置作业时可有必做题和选做题之分,选做题应设置难一些,有挑战性,对做得较好的同学给予鼓励,提高学生的积极性,也有利于拓宽学生编程思路,培养创新能力。

五、考核方式的改进

截止目前,大多高校仍采用笔试考试这一种考核方式。对课程的考核是对教师和学生的考核,笔者认为,采用平时考核、期末理论考试和上机程序调试三种考核方式结合较合适。平时考核以布置作业,考查学生的学习态度和实际动手能力为主,根据完成的程度给分,占20%;期末理论考试采取闭卷考试,主要考查学生对基本知识的理解和阅读别人的程序的能力,占60%;上机考试主要考查学生调试程序的能力,占20%。

由于笔者的能力也有限,在实际的教学活动中还存在需进一步改进的问题,希望笔者的C语言教学中的几点改进建议能给大家带来帮助。

参考文献:

[1]谭浩强.C语言程序设计(第三版)[M].北京清华大学出版社,2005

[2]教育部高等学校计算机科学与技术指导委员会.高等学校计算机科学与技术专业核心课程教学实施方案[M].高等教育出版社,2009

C语言中的指针 第12篇

1 概念

C语言中处理变量、数组、函数、文件时,需要由操作系统把这些量调入内存的不同存储单元中,每个内存单元都对应着一个地址,计算机就是通过访问这个地址来存取对应单元的内容。因此,地址又称为指针。C语言中的每种数据类型在内存中存放所占用的存储单元数是固定的。从而根据数据的第一个存储单元地址(首地址)及数据类型,计算机就可以访问这个数据。变量对应的首地址称作变量的指针。指针变量是用于存放某一类型变量地址的变量。指针变量的定义形式:类型说明符*变量名;其中*表示一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量的数据类型。例如:int*p,t;p=&&t;*p=2008;p为指向整数型的指针变量,t为整数型变量,现将t的地址放到p中即使p指向t的首地址,并对t赋值为2008。

2 运算

2.1 赋值运算

p=&i//将变量i的地址赋给p

p=a//将数组a的首地址赋给p

p=a[i]//将数组a中下标为i的元素地址赋给p

pl=p2//将指针变量p2的值赋给指针变量p1

p=NULL//将指针p赋空值,即不指向任何对象

2.2 指针变量加/减一个整数

p++//p指向下一个对象

p--//p指向前一个对象

p+i//当前对象后第i个对象

p-i//当前对象前第i个对象

p+=i//p指向当前对象后第i个对象

p-=i//p指向当前对象前第i个对象

2.3 两个指针变量相减

若两个指针变量指向同一个数组的元素,则两指针变量值之差是两个指针之间的元素个数再加上1。

2.4 两指针变量比较

若两指针指向同一个数组的元素,则可以进行比较。指向前面的元素的指针变量值小于指向后面元素的指针变量值。

2.5 其它运算

*p//取出p所指的内容

*p++//先*p,再使p+1

*++p//先p+l,再*p

(*p)++p//所指向的内容加1

3 误用

3.1 指针的初始化

没有赋值的指针内容是一个随机的地址值,如果把一个数据写入该地址中,容易造成无法估计的错误,这种错误可能会导致一些最隐匿、最难以跟踪的bug。该错误甚至会破坏计算机操作系统,导致系统崩溃。因此,一定要在对指针应用取内容操作符(*)之前,将指针初始化为一个确定的、适当的地址。例如:下列程序用于将键入的两个整数按大小顺序输出。

这里swap函数的功能是实现指针p1,p2所指单元内容互换,其中以*p为中间变量,这就犯了未定向就使用的错误,根据C编译系统的规则,当swap函数发生调用时,系统仅给指针p分配一个内存单元。而这一内存里存放的地址未定。它可能是操作系统或其它用户区的某一内存地址,当运行程序时,很可能使不属于本程序的某个内存内容被修改,从而造成整个系统的崩溃。对swap函数可修改为如下形式:

3.2 指针类型错误

这里将p=a[0]错用为p=a,虽然a[0]和a的值相同,但a是二级int型指针,而a[0]是一级int型指针,二者指向的对象不同,类型不同,p只能接受a[0]。如果写成:“p=*a;或p=*(a+0);或p=&a[0][0]”也是可以的。

这里将p=a错用为p=a[0],因为类型不匹配,p是指向行的指针,应赋行地址。

3.3 指针偏移

这里,指针初始化p=s,进入循环后p自加,使得p的指针移到字符串的其它部分,甚至移出字符串指向另一变量或程序代码,这很危险。要把“p=s;”放在do循环之中,使p自加操作后复位。

4 指针与数组

4.1 指针数组与数组指针

指针数组,其本质是一个数组,即由指针构成的数组,数据类型是指针类型,说明数组的每个元素都是一个指针变量。如:int p[n];根据优先级关系[]高于*,所以p先与[n]组合,说明p是一个一维数组,长度为n,p前面的*是标记符号的作用,表示p数组不是一般的数组,而是指针数组,数组元素的值是用来存放其他变量的地址,n表示指针变量的个数为n。

数组指针,其本质是一个指针变量,而且这个指针变量是专门用来指向数组的,即指向数组的指针。如:int(*p)[n];()与[]的优先级相同,从左至右结合,(*p)先组合说明只有一个指针变量p,后面的[n]表示指针变量p用来指向一个带有n个元素的一维数组,指针变量的个数为1。

4.2 用指针访问数组

C语言规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素。例如有以下定义:int dates[4],*p:则dates+2=&dates[2];*(dates+2)=dates[2]进一步推广,若有p=&dates[n];那p+i就指向dates[n+i];*(p+i)与dates[n+i]等价;p-i则指向dates[n-i];*(p-i)与dates[n-i]等价;在程序设计中,数组既可以用下标访问,也可以用指针来访问。以下两个函数均为计算整型数组中各元素值的总和。

(1)函数1

(2)函数2

表面看来,函数2似乎比函数1简单。但是C语言的编译程序通常会将其中array[i]处理为*(array+i),每次都要增加一次加法运算,这与函数1中*p比较,效率自然低一些。这正是为什么在C语言中经常使用指针访问数组元素的主要原因。

5 指针与函数

在C语言的函数调用中,所有的参数传递都是使用“值传递”,如果在被调用函数中改变了形参的值,对调用函数中的实参没有影响。一般变量作函数参数时,主要通过函数中的return语句,将一个函数值带回到调用函数,如果想要得到几个返回值,必须通过全局变量。使用指针作为函数参数,就可以通过函数调用改变调用函数中指针所指向的地址的值。如:

这个程序要求的是给ptr动态分配内存,所以当分配了一块的内存,并且这个内存的首地址赋给p,这时候p指向的东西改变了,但没有影响到ptr指针,ptr指针指向的还是它原来的数据,只是p指针的数据改变了。引入一个指针的指针,让p指针指向ptr这个指针,这时候动态的分配的数据块传给*p,这个*p就是ptr,所以给ptr分配内存成功。

6 结语

指针是C语言中最为难学的一部分,也是C语言的精华部分。只有很好地理解并活用指针,才能真正领悟C语言的精髓所在,并且编写出精练而高效的程序。本文阐述了如何去理解好C语言中的指针,当然在理解的同时,需要结合个人实际,多编程、多上机调试摸索,只要做到这些,也许指针也并非那么难掌握。

参考文献

[1]谭浩强.C程序设计.[M].北京:清华大学出版社,2001.

上一篇:原生-态下一篇:重卡行业