深析C语言中的指针

来源 :硅谷 | 被引量 : 0次 | 上传用户:outong
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘 要: C语言为计算机高级语言中基础语言,包含最基本的语言特性。并能够直接访问和系统底层接口。而C语言的精髓知识为指针,同时也是最难理解,应用最广,最重要的C语言知识,将深入浅出的分析指针,从根本了解指针。
  关键词: C语言;指针;应用
  中图分类号:TP3 文献标识码:A 文章编号:1671-7597(2013)0120059-02
  1 C语言指针重要性
  指针是C语言中最重要的概念之一,运用好指针不就能够很方便灵活的处理好复杂的程序的设计,依靠指针的特性能够完成其他高级语言所无法完成的功能,在有些场合运用指针的灵活性是解决问题的唯一方式。如目前很多远程攻击都利用内存的缓冲区溢出来攻击,C语言本身特点不进行变量边界检测,人为介入检查,不仅工作量加大,同时很容易犯错,而所采取的检测库函数,同时也是安全漏洞,在这种情况下,利用指针分析,它可以本质上在C语言程序编译过程中,完成对程序的静态分析,完成对程序的变量边界检查,这种方式只有指针能够完成。指针同时在程序切片调试、自动化硬件技术有着广泛的应用。
  同时指针也是最难掌握的一部份内容,指针的难以理解和应用中潜在危险,如应用指针不小心,也会使得整个程序奔溃。所以,指针在C语言占有非常重要的位置,在C语言的程序设计中应用非常广泛。
  2 指针在C语言中应用
  实际上,指针为变量地址,用于存储地址,程序设计在跟数据类型定义变量,同时为其分配一定大小的存储空间,同时建立变量名与地址空间关联。而指针变量简称指针,它是一种特殊的变量。它的特殊性在于:首先系统为变量,其所存储的内容为地址,而不是常用变量所存储的地址,它只能是整数值,具有一定的含义和运算规则所形成的整型。其次指针的类型指的不是存储数值的类型,而是指针变量的类型。在C语言中,指针的类包括整型、字符型、实型、数组型、结构型、联合型和枚举型等构造类型,它还可以指向函数、文件和指针。
  程序开发人员,在使用C语言的指针时要特别的谨慎,因为如果指针被赋以错误的值,可能无法察觉问题,同时对于系统可能造成很大的影响。程序在调用每次错误的指针时,都会对错误指针所对应的存储单元进行读写。程序中的读操作,只能得到无用或者无效的值;程序中的写操作,所输入的数据将存入未知的地方,这类情况的发生,将使得使程序出现错误,开发人员无法找到错误所在,因此使用指针必须谨慎,建立相应的判别的条件,防止错误无法巡查。
  下面就C语言程序设计中指针使用过程中遇到的特殊问题进行分析并对解决策略进行详细阐述。
  1)其中指针初始化问题,指针初始化相比其他的变量不同,指针是用来存储地址。所以指针初始化形如:
  jnt n=1;
  jnt * str=&b;
  而不能形如:jnt *str=1,由于str为指针,上面str所获得的值不是地址,而是将一个具体的值赋予指针,所以指针指向哪里,就不清楚,这种错误,很容易造成不易察觉的程序BUG。
  2)指针与数组问题,指针和数组存在很紧密的联系,这是C语言构造比较神奇的地方,通过如下的例子了解指针与数组的关系。
  jnt j,b[]={1,4,5,6,7,1};
  for (j=0;j<=9;j++)
  {
  prjntf ( “%d”, b[j] );
  如上例子,b[j]是显示b 数组的各元素值。同样也可以指针访问元素,如下
  jnt j,b[]={1,4,5,6,7,1};
  for (j=0;j<=9;j++)
  {
  prjntf (“%d”,*(b+j) );
  }
  如上例子运行结果和作用跟上面的数组的完全一样,所以可知指针str=*(b+j);
  在看例子来分析数组名与指针变量的关系。
  jnt j,*pb,b[]={3,4,5,6,7};
  pb =b;
  for (j=0;j<=9;j++)
  {
  prjntf ( “%d”, *pb );
  pb++ ; //注意這里,指针值被修改
  }
  这段代码也是将数组各元素值输出。不过,如果把{}中的pb改成b。程序编译出错,不能成功。可知指针和数组名还是不同的。其实上面的指针是指针变量,而数组名只是一个指针常量。指针pb在整个循环中,其值是不断递增的,即指针值被修改了。数组名是指针常量,其值是不能修改的,因此不能类似这样操作:b++。而指针pb的值是终没有改变。所以变量指针pb与数组名b可以互换。
  3)指针与函数
  C语言规定函数的参数传送有两种:值传递和地址值传递,其中实参变量对形参变量的数据传递是值传递,即单向传递只由实参传给形参,而不能由形参传回来给实参,但采用指针变量作为函数参数,可以改变所指向的变量的值,指针作为参数传递为地址传递。不过要注意只有在被调用的函数中指针形参所指向的变量值发生变化函数调用后在主调函数中才能使用这些改变了的值。若在被调用的函数中指针形参的值不发生变化。则不能改变指针实参所指向的主调函数中变量的值。
  vojd fjnd1(chbr [] brrby, chbr sebrch, chbr * pb)
  {
  jnt j;
  for (j=0;*(brrby+j)!=0;j++)
  {
  jf (*(brrby+j)==sebrch)
  {
  pb=brrby+j
  brebk;   }
  else jf (*(brrby+j)==0)
  {
  pb=0;
  brebk;
  }
  }
  }
  如上例是传送的地址,所以在函数内地址进行改变,对应的指也进行了改变,而跟值传送的方式正好相反。一般在函数的参数应用中,利用指针进行地址传送是最普遍的方式,并且能够保持数据的一致性。
  3 深析指针
  指针为C语言难点,如果理解不深,很容易造成错误。一旦造成了错误,也无法容易找出来。此节将对指针容易出现问题,进行分析。
  1)指针分配不一定成功,若不进行事前判断处理,容易造成错误。对于程序开发者容易犯这样的错误,其实通malloc()等函数动态分配空间时,不一定能成功。还有如打开文件时,也应该判断一下是否打开成功了,以防给程序带来不必要的麻烦。在程序设计上,在动态分配空间后,先应该判断是否分配成功,要养成这种程序设计习惯。
  2)通过指针赋值,可能导致内存的数据丢失。在程序设计过程中,容易把指针b=“123”理解成是把字符串赋到分配的空间中了,其实这样理解是错误的。语句指针b=“123”,是把静态存储区的字符串的首地址賦给b指针变量,这样使得p指针又指向其它位置(字符串的首地址),不再指向刚才分配的新空间。所以在进行程序设计时,要理清楚函数赋值的真正含义。
  3)在数组中使用指针及指针函数容易出现的问题。对于组i`nt b[3],其中p指针可以指向数组中任何一个元素,但是对于二维数组而言,情况就比较复杂,也不容易理解。二维数组中数组名b代表第0行的地址,b[0]才代表第0行第0列的地址(这才是二维数组元素的地址)所以不能使得p=b,但可以这样赋值p=b[0];或p=&b[0][0];这里尽管b和b[0]的值是相等的,但意义不同。大部分初学者对这一部分的学习总是比较含糊,下面我们以一种新的思路来理解。
  4)使用指针,容易使人以为传送值,产生内存值变化。程序中的指针使用,特别是函数调用的过程,使用指针作为参数传送时,由于所传送是指针,实际上为地址,所以当函数中地址中的值进行修改时候,实际上内存的值也改变,若程序员不注意,很容易造成数据丢失,时间长了,会造成系统奔溃。
  5)使用指针,很容易使得释放内存在使用。如果程序中没有释放内存的语句。PC的内存空间是一定的,当多次分配内存空间而没有及时释放不用的空间,这部分空间将被认为丢失,不能再被分配,所以很容易造成内存分配完而无法继续分配的情况,这时就造成系统奔溃。所以在新增新空间之后,一定要注意对内存的释放,这样很容易造成内存混乱
  4 总结
  本文对C语言的指针部分进行详细的分析和介绍,特别是对于使用指针过程中遇到的问题进行深入的分析。指针部分在C语言的体系是非常的重要的,其所应用的领域和范围很广,还有很多使用技巧,难点还需要慢慢分析和总结。
  参考文献:
  [1]魏扬,C语言中的指针[J].电脑编程技巧与维护,2008(17).
  [2]韩雨涝,C语言指针与数组关系研究及应用[J].福建电脑,2009(07).
  [3]丁春芳,浅析c语言中指针作函数参数[J].科学大众(科学教育),2010(03).
  [4]张颖,C语言中数组与指针的使用技巧[J].信息通信,2009(04).
  [5]李芳菊,蒋建.C++语言中指针的妙用[J].中国科技信息,2009(01).
  [6]孙泽宇,C语言中指针探讨[J].甘肃科技纵横,2006(05).
  [7]徐辉、王安民,关于C语言中使用指针作为函数参数的问题[J].电脑编程技巧与维护,2009(18).
其他文献
GPS定位信号的提取可以用VB,VC实现,但实际应用时会比较难用。利用C#语言提供的SerialPort类非常简单地实现了GPS定位信号的提取。
摘 要: 随着国际的科技迅速发展进步的情况下,我国国内的经济形势也在进行的大变化,随着城市化进程的加快,我国已经将城市化建设作为国家科技、经济发展的一条必然之路。城市化建设中电气工程与自动化控制成为了不可或缺的一大重要部分。但是,中国国内的电气工程与自动化控制技术一直存在着许多瑕疵,它在控制、管理、处理等几大部分有待提高,旨在对电气工程与自动化控制存在的问题进行分析以及深入研究。  關键词: 电气
“剪纸艺术”是我国民间传统艺术中的一种,它是把艺术作品通过剪纸展现出来,这种艺术反映了我国民间的风土人情,具有一种独特的艺术魅力.初中美术教师可在教学中引进剪纸艺术
摘 要: 變电站是电网运行的中枢纽带,在电力传输的过程中起着关键作用,如果发生雷击,将造成变电站设备的损坏,将严重影响电力输送,给社会经济发展和人民生活带来重大损失和影响。  关键词: 电力设备;防雷;接地装置  1 雷电危害  雷电的危害主要来自三个方面:一是雷电通过线路侵入变电站,而产生过电压;二是雷电直接入侵变电站母线及其设备而产生过电压;三是雷电对地及地面上一些物体放电,线路或设备上产生的
新形势下如何进一步深化教育改革,加强学生的品德教育,这是中等职业学校思想政治工作的一个重要课题。本文就中职学生的品德现状及教育对策有关问题,谈几点看法。一随着中等
介绍了采用 80c196KB单片机对调制信号频率参数的测量方法 ,分析了测频的基本原理 ,并给出了硬件框图及系统流程图。
近几年来,在以市场配置资源、国家用人制度和劳动就业制度发生根本性变化的大环境下,职业学校的各类毕业生都已进入市场,实行自主择业,都要面临多次多种的职业选择。我校从设计学
摘 要: 网络空间已经成为信息化时代的显著特征。网络环境以其便捷性、互动性等优点极大地促成了网络监督的勃兴。而另一方面,网络环境中存在的信息虚假、缺乏理性引导等问题也制约着网络监督的良性发展,进一步优化网络监督环境,是充分发挥网络监督的积极效应的必然要求。  关键词: 网络监督;优势;环境;优化党的十八大报告指出:“加强和改进网络内容建设,唱响网上主旋律”。信息化的社会的网络作为传播信息的一个重要
请下载后查看,本文暂不支持在线获取查看简介。 Please download to view, this article does not support online access to view profile.
期刊
摘 要: 计算机网络的普及应用改善了人们的生活方式和工作方式,给人们的生活和工作提供了众多的便利。但是由于计算机网络的维护工作不到位或者计算机网络本身的因素导致计算机网络存在一定的安全隐患,如不及时处理将会严重影响计算机网络的正常使用。主要是对当前计算机网络的安全隐患进行分析,并就如何防范计算机网络安全隐患提出合理的建议。  关键词: 计算机网络;安全隐患;防范策略  计算机网络的应用为人们的生活