APP下载

C语言编程技术的分析研究

2017-04-25胡昊辽宁锦州渤海大学信息科学与技术学院

数码世界 2017年4期
关键词:存储空间指针C语言

胡昊 辽宁锦州渤海大学信息科学与技术学院

C语言编程技术的分析研究

胡昊 辽宁锦州渤海大学信息科学与技术学院

C语言作为新型语言中的一种,被广泛应用于计算机编程,是通用计算机编程语言,存在于电脑中的形式是一些命令指令,人和电脑之间的交流其实就是通过命令执行实现的,由于C语言灵活性强,所以用来解决很多的繁琐的难题,C语言在数学算术领域中都有着重大的应用,在一定程度加快了计算机的运算的速度和扩展了运算的范围,此外C语言在生活中的应用也很广泛,然而由于使用者没有很好地掌握C语言的严谨性以及C语言的复杂性从而在具体的应用中出现了很多的问题。调试C语言代码性的错误是一个繁琐的过程,所以本文针对这个问题,进行了C语言编程技术的分析。

C语言编程 分析 技术

许多编程人员比较青睐于C语言编程,因为C语言的风格符合现代人的习惯,也符合模块化的设计思想,同时C语言编程的层次分明,方便调试以及维护。正是因为C语言编程的特点是清晰、明了,同时可移植以及具有强大的功能等,所以C语言编程在很多的领域都得到了普遍的运用。C语言提供了很多低级处理的功能,并且拥有着很好的跨平台特性,我们使用的标准规格编写的C语言程序可以在很多平台上进行编译,在现今的软件开发中,使用很普遍。目前在我国的很多计算机等级考试中的的考试内容就围绕着C语言。但是由于C语言编写的特点是灵活性强,同时语法约束不强,所以很多的初学者在学习指针内容时,就容易出现错误,如果指针使用错误,那么代码的可读性就比较差,同时运行效率也比较低。因此在后期的调试中,指针错误从而导致了很多的严重问题,而且这些问题解决起来也不是很容易。

1 编程技术

1.1 C语言中的函数

在C语言的编程过程中,通常会采用模块化的思想,把一个复杂的程序,拆分成多个子程序进行完成,其中的每一个程序实现一个子模块功能,最终通过调用各个子模块的接口,从而完成整个程序的整合。函数是能够完成一定相关功能的执行代码段,可以将函数分为内、外两部分,外部负责数据输送,并且输送数据便能得到结果,而内部便是由代码段构成的“运算器”,它负责将输入的数据进行处理。每一个函数都实现了应有的功能在C语言的编程中,功能的实现是通过函数名反映的。C语言程序中,他的函数数量是无限的,但是,其中必须有一个并且仅有一个以“main”为名的主函数。通常情况下,需要注意的是函数定义包括的内容有函数名、返回值类型以及参数名,然而由于C语言的编译系统携带了很多的函数库,这些函数库中包括了很多的之前就已经定义好的函数,所以当需要实现某个功能的时候,只需要在代码的开头加上“#include”的指令就可以将函数库中的函数调用出来。

1.2 算法技巧及位操作

算法被定义为:一系列解决问题的清晰指令。算法我们也可以理解为它是有基本运算及其规定的运算顺序所组成的完整的运算步骤,它也是一个按照要求设计好的有限的确切的计算序列。一个算法它将拥有以下五个重要的特征:有穷性、确切性、输入、输出、可行性。在设计程序的过程中,程序的灵魂离不开算法,如何掌握算法的技巧对于编程人员至关重要。算法的表示方法主要分为了流程图与自然语言,当编程人员采用流程图的形式表述算法思路的时候,需要事先对流程图中的各个符号有所掌握。在计算机的程序设计过程中,位运算是可操作的最小数据单位,通常情况在,要想实现算法的除法或者是乘法,可以通过位运算实现,从而大大提高代码的运行速率。因为计算机的数据都是以二进制的形式储存,位运算就是直接对内存中存储的二进制数据进行操作,因此十分快捷。位运算的基础操作符有以下六种“&、|、^、~、<<、>>”,在这六种操作符中,只有“~”取反是单目操作符,其余“&、|、^、<<、>>”五种均为双目操作符。而且,在使用过程中,一定需要注意:位操作只作用于整形数据,“double、float”类型数据都会出现错误。

使用位操作时,由于位操作符运算优先级低,为了保证它的运算顺序,我们通常使用括号来使它运算正常,否则得出的结果啼笑皆非。比如我们现在要得到一组等差数列数据:1,3,5,7,9……。如果我们写成int a=1<

2 指针用法

在C语言中指针是一个十分重要的数据类型,同时C语言重要内容之一是指针。将指针运用到C语言的编程中能够大大地提高代码的运行效率,同时还可以大大地节省代码的存储空间,然而指针对于很多的初学者而言有一定的难度。一旦没有正确掌握指针的用法,那么在代码运行的过程中就会引发很多的问题。指针所指向的是存储空间,而存储空间的分配方式能够分为静态和动态分配两种。所谓的静态分配指的是当C程序在编写的时候存储空间就已经确定下来了。当选择全局变量的时候,比如static char b[sizes],指的是分配给变量b的空间是sizes比如定义的是一个局部变量char c[sizes],那么在函数执行的过程中,局部变量b所得到的空间是sizes,当调用函数结束后变量b的存储空间就会被自动释放。所谓的动态分配指的是通过库函数malloc (sizes)堆中的调用从而给变量分配的空间是sizes,当结束调用后返回的值类型是指针,在编程的过程中一定要记住,当时存储空间使用结束后,一定要记得通过free()函数释放空间。使用C语言进行代码的编程时候,必须要正确掌握指针的用法,不然如果使用错误,就会出现一系列的错误,这些错误具体总结如下:

(1)当使用C语言编程,定义指针变量的时候,没有给指针赋初值,从而使得该指针变量成为了一个“野指针”。所以在当后面用到了这个指针所指向的空间的时候,就会出现代码性的错误,由于指针变量定义后,指针变量所对应的值是未知的,也就是说指针可以指向任意一个内存地址,这个时候指针所指向的内存直接完成赋值操作,把这个单元里最初的数据覆盖掉,从而造成了数据的缺失,如果指针指向系统的数据区,那么会造成系统运行出现异常,最坏的情况是出现了系统死机。所以,在使用C语言编程代码的时候一定要给指针变量赋值,保证正确使用指针。

(2)指针空间分配使用的语句为q=malloc(size),需要先检查参数q,如果p=NULL那么说明了这个存储空间为空,这个时候就不可以操作p所指向的空间,即便是分配了空间给p,其空间必须是C语言所规定的空间范围之内。当空间运用结束后,必须要通过free函数释放该空间,不然容易造成存储空间耗尽的情况。

(3)栈溢出。栈的作用主要是用于当一个子函数被调用的时候,完成现场的保存以及现场的恢复,同时还包括了局部变量的参数传递以及局部变量的存储等然而在调用子函数中,当错误使用子函数里面的局部变量指针,就会产生栈溢出的现象。比如子函数的代码如下:

char point1[10];

strcpy(point1,“ warning: this is a testing case ...”);

因为在这个栈中只分配了10个字节空间给局部变量,但是使用函数strcpy()的时候,指针point1指向的超过了10个字节的字符串,所以这个时候很可能会重写把栈中所存放的函数返回地址的内容,因此在执行完子函数之后原来的函数就很难回去了,执行将会终止。

(4)堆溢出。使用堆的时候需要考虑到代码运行的平台的以及编译器,堆溢出是一个很复杂的过程。比如程序代码:

char * point1;

point1=(char *) malloc(10);

strcpy(point1,“warning: this is a testing case ..”);

由于point1指针定义中,所分配的是10个字节空间,但是当在执行函数strcpy()的时候指针point1指向的是超过了10的字符串,所以造成了堆溢出,从而导致程序报错。

(5)void用法。在定义函数的时候,如果函数名前面有void,那么意味着这个函数的返回值是空,然而这种情况除了库函数void malloc(size)之外,这个函数名的前面也有void,但是这并不意味着malloc(size)的返回值是空,而是意味着函数的返回值能够转换成任意其他的类型地址值(比如string* ,float *,long *等)。void不可以用在数值变量的定义过程中,然而指针变量的定义能够用void来实现,void的真正意思是指针变量能够指向所有的数据类型的地址。

(6)在使用过程中,区分数组是不同于指针变量的,可以通过指针加减数值来实现指针的位置移动,比如q+=9,指的是将指针q的位置往后面移动9个位置;但是数组名是可以移动的,比如char a[22];a++;不可以这样操作数组a。

(7)当移动指针的时候,挪动的位移和所定义的指针类型是有关系的,比如分别将指针p与q定义成:char*p;int*q;后续的语句:p+=20;q+=20;那么这意味着字符型指针p是往后面移动了20个字节,同时整型指针q往后面移动了20个长度,也就是80个字节。使用指针变量的时候一定要保证和所定义的类型是一样的。

(8)需要注意所定义的指针变量的区别。比如定义为:int(* p) [20]和int* p[20],这两者之间是有区别的,int(* p) [20]中的(* p)为先,因p指的是一个指针变量,指向了包含有20个整型数的数组;同时int * p[20]代表着p[20]为先,所以指的是定义了指针数组p,该变量它包括了20个指向整型数组的指针元素。

3 优化编程方法

C语言编程方法能够大大地增强程序的运行效率以及代码的可读性。下面将对C语言编程优化进行简单地描述。

当调用函数的时候传递结构是被禁止的。函数调用第一步是把参数传递给寄存器或者堆栈,当函数参数在传递的过程中,内容是结构的话,那么C语言编译器就要把整个结构全部拷贝到到堆栈中,从而造成了堆栈空间负担,这个时候能够通过采取结构指针减少空间的负荷。在C语言编程中编程效率的优化可以通过C语言中自带的库函数实现。然而,由于在设计的时候这些标准库具有自身的广泛适用性,所以该函数库的使用是有约束条件的。而且即使是使用了函数库,由于代码量大,所以很容易造成,代码运行效率低的结果。比如库函数srPintf()的实现就是通过许多的代码完成的,在编程中如果编程人员调用的srPintf()函数是不包括浮点处理(%f),最好是编程人员自己设计代码完成整个功能,这样可以大大提高代码效率。

结语:采用C语言进行编程的软件有着很大的开发前景,针对C语言编程有很多方面都需要引起注意,对C语言进行优化可以大大地提高C语言的运行效率,编程人员要想正确掌握C语言的编程,需要多多地理论联系实践,多多地参与编程的实践中,并且对C语言的编程方法不断进行优化处理,从而增强C语言的编程可读性以及可移植性。C语言在众多的领域中都有着重大的意义,所以正确掌握C语言是十分必要的。本文主要针对C语言编程技术进行了分析,介绍了C语言函数,指针正确使用以及C语言优化等方面。

[1]潘津.C语言编程技巧在C语言学习中的应用研究[J].电子技术与软件工程,2013(16):218-218

[2]侯成杰.航天器C语言软件常见编程错误分析及检测方法研究[J].空间控制技术与应用,2013,39(6):53-57

[3]刘秀明.基于C语言的计算机软件编程实验研究[J].电子技术与软件工程,2014(5):263-263

[4]祁昌平.C语言程序设计 课程教学探讨[J].电脑知识与技术,2009,5(17):4488-4489

猜你喜欢

存储空间指针C语言
基于多种群协同进化算法的数据并行聚类算法
苹果订阅捆绑服务Apple One正式上线
垂悬指针检测与防御方法*
基于Visual Studio Code的C语言程序设计实践教学探索
用好Windows 10保留的存储空间
51单片机C语言入门方法
基于C语言的计算机软件编程
为什么表的指针都按照顺时针方向转动
高职高专院校C语言程序设计教学改革探索
浅析C语言指针