C语言中指针探讨
2016-11-18李帅于子钧谷浩荣
李帅 于子钧 谷浩荣
摘 要:C语言是某一个实体的地址,当我们在使用C语言进行编写程序的时候,就一定会使用上指针,指针的操作是编写程序的一个点。如何更好地使用指针,将是我们进行更好的书写程序的关键。指针变量的运用是C语言程序设计的重要核心部分。程序中的数据在内存中的有效读取及程序执行效率的提高多数情况取决于是否灵活使用指针。本文旨在探索C语言程序设计实践过程中如何正确操作指针变量,从而方便操作与之关联的字符串、数组、函数间数据的传递,继而解决C语言程序设计中的许多实际问题。
关键词:C语言;指针;数组;地址
地址:在计算机中,所有的数据都是存放在存储器中的。一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细的介绍。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫做地址。严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,我们中约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针的目的是为了通过指针去访问内存单元,在C语言中,一种数据类型或数据结构往往都占有一组连续的内存单元。用“地址”这个概念并不能很好地描述一种数据类型或数据结构,而“指针”虽然实际上也是一个地址,但它却是一个数据结构的首地址,它是“指向”一个数据结构的,因而概念更为清楚,表示更为明确。这也是引入“指针”概念的一个重要原因。因为数组或函数都是连续存放的。通过访问指针变量取得了数组或函数的首地址,也就找到了该数组或函数。这样一来,凡是出现数组,函数的地方都可以用一个指针变量来表示,只要该指针变量中赋予数组或函数的首地址即可。这样做,将会使程序的概念十分清楚,程序本身也精练,高效。
1 指针
所谓的指针,本质上就是地址。指针变量的值,就是地址的值,当取值运算时就是到对应的内存地址上,依照指针类型进行取值。指针是一个地址,指向的是个类型:我们知道,c语言中的类型有int,char,bool(这个不常用),一般我们使用int,char就可以满足一般的类型需求的,如果对于变量的长度过大,就是用long,float,double,关于各个类型使用的长度问题,可以使用sizeof(int)或者sizeof(long)来查看各个类型,在系统中的小。
而指针就是一个8个字节(64系统)。在C语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。图中,设有字符变量C,其内容为“K”(ASCII码为十进制数75),C占用了011A号单元(地址用十六进数表示)。设有指针变量P,内容为011A,这种情况我们称为P指向变量C,或说P是指向变量C的指针。严格地说,一个指针是一个地址,是一个常量。而一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,我们中约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针的目的是为了通过指针去访问内存单元。
指针指向的是地址,地址指向的是内容:
我们需要一个变量,来存储地址,这个变量的值是地址,但是我们可以通过修改变量的值,来不断地改变地址,但是,我们如果需要改变该个地址的值的话,就需要,对地址的值进行修改,而不改变地址。
inta=10;
int*p;
p=&a;
*p=11;
a=?
这里我们看到,p是一个变量,我们使用p来存储变量a的地址,这是,我们使用*p对于这个变量进行赋值,那么a的值最后,是多少呢,结果是11,因为我们使用*p赋值,就相当于a=11,赋值效果一样的。
指针的指针,是面对于指针的变量:
我们说,指针的指针的时候,就有点不清楚了,到底怎么区分指针和指针的指针呢?
char*p;
char**pr;
pr=&p;
我们这样看就清楚了一点,char*(*pr);*pr是一个存储的值为指针的变量,pr就是存储上个变量地址的变量。整合起来就是,pr是一个存储的值为指针的地址的变量。这样,我们就基本,对于指针有一个直接的了解了。既然根据内存单元的编号或地址就可以找到所需的内存单元,所以通常也把这个地址称为指针。内存单元的指针和内存单元的内容是两个不同的概念。
2 指针的类型指针的类型
从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:
第一,int*ptr;//指针的类型是int*。
第二,char*ptr;//指针的类型是char*。
第三,int**ptr;//指针的类型是int**。
第四,int(*ptr)[3];//指针的类型是int(*)[3]。
第五,int*(*ptr)[4];//指针的类型是int*(*)[4]。
3 指针指向的类型
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:
第一,int*ptr;//指针所指向的类型是int。
第二,char*ptr;//指针所指向的类型是char。
第三,int**ptr;//指针所指向的类型是int*。
第四,int(*ptr)[3];//指针所指向的类型是int()[3]。
第五,int*(*ptr)[4];//指针所指向的类型是int*()[4]。
4 指针变量与变量指针
常量指针:该指针是一个常量,不可改变,指向某个地址之后就不能改变了,但他所指向的单元是可以改变的,很容易与指针常量弄混,所以一般读的时候读成常量指向,从字面上看就是一个常量指向某个地址。指针常量说明该指针所指向的是内容不可改变,但其自身是一个变量,可以改变指向的内容,读的时候读成指向常量,从字面上看就是指向某个常量。
5 C语言指针的作用
指针可以直接操作内存,理解为直接操作内存的优点有哪些。
第一,效率更高,这个很容易理解,直接操作内存,效率必然更高。
第二,可以写复杂度更高的数据结构,这个也好理解,程序员可以操作内存,当然可以写出灵活、复杂的数据结构。
第三,编写出简洁、紧凑、高效的程序。
6 结语
C语言是一种面向过程的程学设计语言,在代码量超过一定大额数额后程序设计的效率会明显下降,这是它相对于其他的面向对象的程序设计语言的缺点,但是它的优点是可以比其他的语言更加的接近于硬件底层,这种特性直接导致它可以用来设计计算机操作系统,Unix就是它的产物!所以说C语言有着其他的语言不可替代的功能,既有缺点,也有优点。
参考文献:
[1] 梁冯兰.对C语言中指针的探讨[J].和田师范专科学校学报,2006,26(5).
[2] 许晶. C语言中指针运用与探索[J].中国科教创新导刊,2013(23).
作者简介:李帅(1997—),男,湖南衡阳人,沈阳理工大学学生。
于子钧(1995—),男,辽宁丹东人,沈阳理工大学学生。
谷浩荣(1996—),男,辽宁营口人,沈阳理工大学学生。