C语言中的指针使用技巧

时间:2022-06-27 05:38:17

C语言中的指针使用技巧

摘 要 指针使得C语言在编程的过程当中增加了灵活性,它让程序员可以直接和地址打交道,而不仅仅使用系统栈分配的地址。掌握指针的应用,可以使程序简洁、紧凑、高效。笔者在从事C语言教学中发现很多同学在学习指针时非常困难,对学习内容一知半解。笔者将从指针变量的定义及指针的应用方面阐述C语言中的指针。

关键词 C语言;指针;程序设计

中图分类号TP39 文献标识码A 文章编号 1674-6708(2011)56-0173-02

1 C语言中的指针简介

指针就是表示地址的一种变量,所以指针的范围严格来说只能是自然数的,并且不能在两个指针间进行加、乘、除这样的运算。由于在C语言中每个数据类型都必有存储空间,所以指针可以应用于几乎所有的数据类型中。所以,从这个角度出发可以将指针分为:指向变量的指针、数组指针、字符指针、指向指针的指针、函数指针、结构变量的指针以及文件指针等等。

其中,指向变量的指针就是存储变量的地址的。如 int * s这就是一个指向整型的指针,可以用于指向一个整型变量。如int a; 当p=&a时,就是将p存储整型变量a的地址。这是指针最简单的一种类型。所谓数组指针,就是指数组的名称实际上是指向整个数组空间的首指针。如 int a[10];其中a本质上是一个指针,指向该数组的第一个位置,a[2]表示距离a指向空间向后2个位置所在空间中的存放的值。所以,a[2]=*(a+2)。字符指针本质上是数组指针的一种特殊情况,就是存放字符串的数组所对应的数组名。指向指针的指针这是一类很特殊的指针,用于存放指针的一类指针,在本质上与指向变量的指针十分相似。例如 char *ss[N]={“java”,”sss”,’’rrr”}。指向函数的指针就是指向函数入口地址的指针。结构变量的指针这类指针和指向变量的指针很类似,主要的区别在于结构变量可能有多个类型不同的变量,所以一般空间较大。文件指针就是对文件进行操作的指针。从上述的分类可以看出无论什么类型的指针其功能都是一样的就是用于指向对象的地址空间罢了。

上面简要的介绍了指针的定义和分类,现在简要的论述一下指针涉及到的运算操作。首先由于指针是存放的变量地址的,所以第一个操作就是对指针进行地址赋值。如int a,*p;

P=&a,这就是对指针p进行进行赋变量a的地址,p指向变量a。当然也可以通过指针获取指针指向地址空间所存储的值。如int b=2,*p;p=&a,这是*p就表示p指向空间所存储的值,在本例中就是a的值2。为了能在数组指针中通过指针能访问到整个数组的值,所以。可以对指针进行加减整数值,表示地址的前移或后移。如int a[10],*p,*s; p=a;s=p+2;其中s 的值表示数组中首地址向前移动2的位置,表示 a[2]对应的地址。 为了表示两个地址间存在的距离,可以通过指针间的减法实现。当然指针涉及到的还有其他运算,现不详述了。

2 C语言中的指针算术运算

指针可以加上或减去一个整数,这和c语言中的算术表达式意义是不同的。例二:

(1)int a[20]; (2)int *ptr=a; (3)……… (4)ptr++;

在上例中,指针ptr的类型是int*,它指向的类型是int,他被初始化为指向数组a的起始地址,接下来的第4句中,指针ptr被加了1,编译器编译程序时把指针ptr的值加上了sizeof(int)。

由于int型在32位机中的长度是4个字节,故原来ptr指向数组第0号单元开始的四个字节,此时指向数组从第4号单元开始的4个字节。

3 运算符&和*

&是取地址运算符,*是指针运算符或称为间接访问运算符。&a的运算结果是一个地址,即变量a的地址。*p为指针变量p所指向的存储单元的内容,即p所指向的变量和值。下面举例说明。例三:

int a=12;

int b;

int * p;

int * * ptr;

p=&a; /*把变量a的地址赋给指针变量p。 */

*p=24; /*把24赋给指针变量p所指向的存储单元的内容 */

ptr=&p; /*把指针变量p的地址赋给指针变量ptr。*/

*ptr=&b; /*把变量p的地址赋给指针变量ptr。 */

* *ptr=34; /* *ptr的结果是ptr所指向的存储单元的内容,即变量b的地址,再做一次*运算,结果就是一个int类型的变量。*/

4 C语言中的指针应用

在C语言中指针的十分应用广泛,除具有一般的功能外,具体特殊功能的应用总结起来有三个方面:一是用于在函数中可以返回多个值;还有就是可以实现动态调用函数;最后就是实现数组的动态定义。其中,由于由函数的特点,一个函数只能有一个返回值,但在有些场合需要返回多个值,就可以定义指针参量来实现,其定义的基本框架如下:

Sss( int a,int *p )

{int s;

…….

………

Return s;

}

在这中情况下,函数不仅可以得到返回值(通过Return s来实现的),还可以通过指针p来返回相应的值。所谓指针能实现动态调用函数,这里用到的指针就是上文中提到的函数指针。函数指针就是指向函数入口地址的指针,我们还知道其实函数名就是一个函数指针。我们就是通过函数名实现动态调用函数的。在主调函数的参数中采用函数名充当实参就能实现函数的动态调用。该方法以简短的代码实现了复杂的功能。最后讲到指针能实现数组的动态定义。从C语言的学习中,我们知道在定义数组时一定要指定数组的大小,否则,不能完整数组的定义。那么如何实现数组的动态定义。数组从本质上来讲就是连续的空间集合罢了。那么,我们可以通过申请一个空间并赋值给一个指针变量,以此指针变量为首空间,就能获取连续的空间,这与数组相同。当然数组还有许多应用,只有认真分析就能得到更多更好的应用实例。

5 结论

指针是C语言中的一个重要概念,也是C语言的一个重要特色。掌握指针的应用,可以使程序简洁、紧凑、高效。每个学习和使用C语言的人,都应当多思考、多上机,在实践中深入的学习和掌握指针。

参考文献

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

[2]张丽霞.C语言指针详解[J].赤峰学院学报:自然科学版,2005,21(5):37-38.

[3]洪维恩.C语言设计[M].北京.中国铁道出版社,2003,11.

上一篇:央视《交换空间》中的本土化元素分析 下一篇:电力安全调度研究