C语言中指针运用与探索

时间:2022-08-09 10:42:48

C语言中指针运用与探索

摘 要:指针变量的运用是C语言程序设计的重要核心部分。程序中的数据在内存中的有效读取及程序执行效率的提高多数情况取决于是否灵活使用指针。本文旨在探索C语言程序设计实践过程中如何正确操作指针变量,从而方便操作与之关联的字符串、数组、函数间数据的传递,继而解决C语言程序设计中的许多实际问题。

关键词:指针变量 数组 字符串 函数 常见问题

中图分类号:TP312 文献标识码:A 文章编号:1673-9795(2013)08(b)-0163-01

指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的特点之一。利用指针变量可以表示各种数据结构,也能很方便地使用数组和字符串,更加能像汇编语言一样处理内存地址,[1]从而编写出精练而高效的程序。

1 指针变量的使用优势及常规用法

(1)使用指针指向数组首地址,简化了数组相关的程序内容的书写,避免了整体使用数组,在程序执行中减少了先找数组元素的地址再取数组元素内容的过程,直接在数组所在的地址范围内操作数组元素,提高了程序的执行效率。(2)使用指针指向字符串(即字符数组),把一个字符串整体当作一个数组元素,多个字符串的指针变量就构成了指针数组,不仅节省了内存空间,还大大地提高了程序的执行效率。(3)指向单变量的指针变量作为函数参数,可以在程序执行过程中及时转向调用函数的入口。节省内存空间的同时,把指针变量替代单变量作为直接变量在调用函数执行过程中执行相应程序操作,免去了返回值的执行时间与过程。(4)指向结构体复合变量的指针变量作为函数参数,可以通过变化结构体变量灵活使用指针变量在调用函数中执行函数的程序操作,不仅节省内存空间与执行时间,而且方便程序变量的修改,提高了程序的可移植性。(5)指向函数的指针变量作为函数的参数,可以在一个主函数中实现多个自定义函数功能间的调用,大大地提高了程序的灵活性与可移植性及程序执行的效率。(6)使用指针指向文件类型结构体,可以找到与之相关的文件,实现文件的访问,在主函数执行过程中灵活转向其它文件的执行。

2 指针变量使用常见问题及解决方法的探求

2.1 指针变量的初始化

同其他变量的初始化相似,在指针变量的定义之后就应该给指针变量赋一个初始的地址值。如果没有给定义的指针变量赋初值的话,指针变量的值不定,可能会导致一些隐藏在某些地址号的内存中的难以跟踪的漏洞(bug)运行。如:

int *p; *p=100;

p定义为一个指向整型变量的指针变量,但是却没有给p赋予一个初始的地址值,只是把一个存储100的常量的存储单元的首地址赋给了p,而这个存储单元的首地址可能在程序其它位置另作它用,就会产生隐形的难以追踪的bug的运行。因此,为了避免可能性的发生,就要和其他变量的使用一样,在定义指针变量的时候就要同时给予指针变量一个初值,以确定指针变量的初始的地址,即指针变量的初始化。将上述例子修改为:

int a=100; int *p=&a;

还要注意把“int *p=&a;”和“*p=&a;”混淆,前者是指针变量的初始化语句,即定义的同时给指针变量赋初值,而后者是一个旨意错误的赋值语句,把整型变量a的首地址赋给了p所指向的整型变量。

2.2 指针变量的赋值

给指针变量赋予的初值一定是地址。同样,在程序中给指针变量重新赋予的值也只能是地址或使指针变量指向同类型的变量值的首地址。如:

int a,*p; p=a;

要使p指向a,就要有地址运算符&对a取首地址后赋给p,或者把变量取内容赋给p,而不是直接把a赋给p。C语言编译器会提示指出这是个语法错误,给指针变量赋予的内容和指针变量不匹配。正确的赋值一般形式为:

int a,*p; p=&a;

或 int a,*p; *p=a;

还要说明的是指针的指向要有具体类型说明。不能给指针赋予与其基类型不符的地址,否则也会出现语法上错误。如:

int a=100; double *p; p=&a;

在给指针赋值时,不只要求是地址,还要是一个与该指针类型相符的变量或常量的首地址。而上述例子中,a是整型的变量,p是基类型为双精度型的变量。二者不相匹配,这种赋值在编译时就会发生语法错误。因此,给指针变量的赋值要注意指针变量的基类型,即指针变量能够指向的变量类型。

2.3 指针在函数之间值的传递

#include “stdio.h”

void swap(int *a, int *b)

{int t; t=*a; *a=*b; *b=t;}

void main( )

{int x,y; printf(“请输入两个整数:”);

scanf(&x,&y); printf(“x=%d, y=%d\n”,x,y);

swap(&x,&y); printf(“x=%d, y=%d\n”,x,y);}

函数间的值传递也可以通过实参的地址单向传递给形参的指针变量,直接调用函数,完成函数间数据传递的目的。主函数main( )在调用函数swap( )的同时,把变量x和y的地址分别单向传递给了指针变量a和b。也就是主函数中对整型变量x和y的操作,通过地址的传递,虽然在调用函数过程中形式上是对指向整型变量x和y的指针变量a和b的内容(即x和y)的操作,实质上仍然是继续对整型变量x和y调用函数的操作。也就没有必要给主函数返回x和y的值了。省去了返回的时间和操作过程,提高了程序的执行效率与正确率。

2.4 指向指针变量的指针变量

*p,**p,***p分别叫做一级指针、二级指针和三级指针。如果这样定义:

int a, *p, **q, ***r;

则第一个*p中的p可以用来存放普通整型变量的地址,例如赋值:p=&a。第二个**q中的q可以用来存放整型变量地址的地址,例如指针变量p的地址,p是指针变量,变量的值是整型变量a的地址,那么p这个指针变量的地址就需要一个比p高一层的指针来存放。因此可以这样赋值:q=&p。第三个***r,道理相同,可以这样赋值 r=&q。指针的嵌套使用,使程序在执行时更灵活,更有效率。

3 指针的使用是C语言程序设计中最重要的一环

能否正确理解和使用指针是我们是否真正掌握C语言的一个标志。C语言中指针的使用比较灵活,很多人在实际编程中很容易出错,而且这种错误恰恰又难以发现,所以建议初学者大量地上机调试程序,以弄清一些细节,并积累经验,为后续编程内容的学习打好坚实的基础。同时,指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程并上机调试。只要做到这些,指针也是不难掌握的。

参考文献

[1] 田淑清.全国计算机等级考试二级教程―― C语言程序设计[M].北京:高等教育出版社,2006.

作者简介:许晶(1978―),女,满族,籍贯:山东日照,职务:教师,职称:讲师,研究方向:网络编程、数据库技术。

上一篇:数控车教学初探 下一篇:实验中心管理模式和运行机制研究与实践