论文部分内容阅读
摘 要: 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).
关键词: 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).