浅析C语言指针 刘东迎 祁梦雅(黄淮学院,河南驻马店463000) 摘 要:指针是c语言的精髓,也是学习c语言的一个难点。指针概念复杂,使用灵活,因此初学者在使用时经常出错,我们应该多思考、多比 较、多上机,在实践中掌握它,这样才能更好地理解并运用这种数据。正确而灵活地运用它,可以有效地表示复杂的数据类型。正确掌握指针 的应用,可以提高程序的灵活性和运行效率。 关键词:C语言;指针应用 1指针的概念 有些初学者在调用CreateList(head)时没有对实参head 指针是某一个实体的地址。当我们要访问某一变量是,如 赋值,只是声明了head是结构体指针。这时虽然实参和形参的 果不是直接通过变量名来进行,而是通过存放变量地址的指针 类型相同,但实参没有指向任何具体的内存空间。如 见解进行,称为“间接访问”。c语言中处理一个变量、一个数 void main() 组、一个函数、一个文件时,需要由操作系统把这些量调入内存 的不同存储单元中,每一个存储单元都有一个地址,指针变量 是用于存放某一类型变量的地址的变量。 2常见的指针类型 2.1指向简单变量的指针 例如:int*p,i:p:&I: 上例中,指针变量P指向变量i,也就是说,指针变量P存放 的是变量i在内存中的存储首地址。其中,指针P和变量i同为 int类型。 2.2指向数组的指针 例hi:main() {int s[2]:{1,4): int木p: for(p=s;p printf(“%2d”,木p);) 上例中,循环条件中的p=s表示指针P指向数组s的首地址, 通过p++控制指针完成对数组s的各元素的访问。 2.3指针数组 例 ̄H:main() {int p[2],i,s[2][2]={l,4,8,9): for(i=0:i<2:i++) p[i]=s[i]: printf(“%d\n”,半(p[c0+1)):) 上例中,指针p本身就是一个数组,通过for循环给指针数 组中的每个指针变量赋值,p[0]的初值为数组s的第一行的首地 址,则木(p[0]+1)便是元素a[0][1],因此程序输出4。 2.4指向指针的指针 例pN:main() {int a[2][2]={1,4,8,9),木p[2],木木q,i for(i=O;i<2:i++) p[i]=a[ q=p: printf(“%d\n”,木(木(q+1)+1)):) 上例中,指针数组P的各个指针变量指向数组a的各行 首地址,q指向指针数组P的首地址,丰(q+1)等同于P[1],如 此,木(木(q+1)+1)便等同木(p[1]+1)也就是a[1][1],因此程序输出 9。 3常见错误分析 3.1指针没有指向任何内容就当作函数实参调用函数 {struct LNode术head;int len; CreateList(head):len=ListLength(head): printf( The length of List is%d ,len) ) 以上程序中head是一个指针,它并没有指向任何位置,更没 有指向一个具体的结点,则调用createList(head)后参数L也和 head一样,函数中q=L之后q->next=p不能正确执行。 3.2指针运算错误 在定义ListLength(struct LNode木L)时,将while循环 中p指针指向下一个结点写成p++。 int ListLength(struct LNode L) {int i=O;struct LNode木q:q=L: while(q){i+ :p+ :)return(i): ) p++只能用在p指向一段连续的空间时,p指向下一个元素 时用。在此程序中,p是指向链表中的某个结点,结点是动态分 配的,结点与结点之间在空间上并不一定是连续的,所以p+—.之 后,p并不一定指向下一个结点,所以下一个结点和下一个空间 是完全不同的两个概念。正确的写法应该是“p=p->next;”。 3.3错误的指针赋值 void CreateList(struct LNode爿cL) i struct LNode木P,木q:q=卑L: int num;printf( Input data of Node(-1 means end): ):scanf( %d ,&num): while(num!=一1) {P=(struct LNode malloc(sizeof(Node)): p一>data=num:q一>next=木P:q=q->next:scanf ( %d ,&num): ) ) struct LNode{L说明L是指向结构体的指钆q也如此。礼 是引用L指向内容,q=木L是把L指向的结构体赋给了一个指针变 量,赋值号两边的类型不一致。q->next=*p也是如此。正确的应 该是q=L和q->next=p。 [参考文献] [1]张琳梅,尚永强.浅谈C语言中的指针[J].电脑知识与技 术,2008(35):2546—2549. [2]谭浩强.c程序设计[M].北京:清华大学出版社,2005. [3]卢有杰,吴炜煜.c语言高级程序设计[M].北京:清华大学出版社,1999.