c语言有关指针的程序,C语言指针及应用

摘要:首先介绍了C语言中指针的有关概念,然后运用指针实现了一个链表程序,针对初学者在实现该程序时常见的一些错误,分析了错误出现的原因,并对这些错误进行了更正。

关键词:C语言;程序;指针;链表

中图分类号:TP312文献标识码:A文章编号:1009-3044(2010)01-244-03

Application of Pointer in C Language

ZHANG Bin-lian

(School of Information Management and Engineering, Jishou University, Zhangjiajie 427000, China)

Abstract: First introduced concept of pointer in C language, then designed a link-list program by using pointer. For some common errors appeared when beginners designed program with C language, analyzed the wrong reasons and corrected these errors.

Key words: C language; program; pointer; link-list

指针是C语言的一个重要概念,在C语言中被广泛的使用,它和数组、字符串、函数间数据传递有着密不可分的联系。在某些场合,指针是运算得以解决的唯一途径,它可以有效的表示和实现复杂的数据结构。正确掌握指针的应用,可以使程序简洁、紧凑、高效。由于指针的概念比较复杂,使用比较灵活,所以初学时常会出现错误,而一般教材中讲述指针相关内容是从语法和用法着手,并没有对实际程序中的错误进行分析。因此对于初学者,有必要根据实际程序对指针的相关概念和使用时常见的一些错误进行分析。本文将先介绍指针及指针的类型,然后分析几种初学者在使用指针实现单链表操作时出现的错误,并对这些错误进行分析更正。

1 指针的相关概念

1.1 定义

指针是某一个实体的地址。当我们要访问某一变量是,如果不是直接通过变量名来进行,而是通过存放变量地址的指针见解进行,称为“间接访问”。C语言中处理一个变量、一个数组、一个函数、一个文件时,需要由操作系统把这些量调入内存的不同存储单元中,每一个存储单元都有一个地址,指针变量是用于存放某一类型变量的地址的变量。

1.2 指针的类型及应用

1) 指向简单变量的指针

指针所指的数据类可以是简单的数据类型。

2) 指向数组的指针

指针所指的数组既可以是一维数组,也可以是多维数组。

例:void main()

{int arr[3] = {1,2,3};

int *p;

for (p = arr; p < arr + 3; p++)

printf (" %d ", *P);

}

程序中指针p指向了数组arr的首地址,通过p++来访问a数组的每一元素。

3) 指针数组

指针数组是指数组元素是由指针变量组成的。定义如:int *p[2],其中指针数组p包含两个元素,每个元素是指向整型数据指针。

例:void main()

{int *p[2],i;

int arr[2] [ 2 ]={1,2,3,4};

for (i = 0;i

printf ("% d\n",*(p[0]+1));

}

程序中p是一个指针数组,通过for循环语句给指针数组中的每个指针变量赋值,p[0]的初值为二维数组a的首地址,*(p[0]+1)便是元素a[0][1],因此程序输出2。

4) 指向指针的指针

指向指针的指针是指指针变量指向的是某个指针的地址,定义如:int **P。

例:void main ()

{ int **P,i;

int arr[2][2]={1,2,3,4};

p = a;

for (i = 0;i

printf(" %d\n",*(*(p+1)+i));

}

程序中指针p指向二维数组a的首地址,p+1指向数组a的第二行,*(p+1)为第二行第一个元素的地址,**(p+1)为数组第二行的第一个元素,*(p+1)+1为第二行第二个元素的地址,*(*(p+1)+1)为数组第二行的第二个元素,因此程序输出3和4。

5) 指向函数的指针

指针变量指向函数的首地址,然后通过该指针变量调用该函数。定义如:int (*p) ()。

例:int max (int a,int b)

{int c;

if (a>b) c=a;else c=b;

return (c);

}

void main ()

{int(*p)();int a,b;

p=max;scanf ("% d,%d",& a,& b);

printf("max=%d\n",(*p)(a,b));

}

程序中int(*p)()定义了一个指向函数的指针变量p,函数名max代表了函数max()的入口地址,把p=max,指针p就指向了函数max,(*p)(a,b)是通过p调用函数max。

2 指针应用实例错误分析

2.1 链表应用程序

为了分析使用指针时常见的错误,我们写了一个链表程序,具体包括生成链表和求链表长度两个功能,程序代码如下:

# include

# include

struct LNode

{ int data;

struct LNode *next;

} Node; /*定义结点*/

void CreateList(struct LNode *L) /*建立链表的函数*/

{ struct LNode * p , * q;q=L;

int num; printf ("Input data of Node(-1 means end):"); scanf ("%d",&num);

while(num!=-1) /*输入-1时结束*/

{ p = (struct LNode *) malloc (sizeof (Node));

p->data=num; q->next=p; q=q->next; scanf ("%d",&num);

}

}

int ListLength ( struct LNode * L) /*求链表长度的函数*/

{ int i=0;struct LNode *q;q=L;

while (q){i++; p=p->next;} return (i);

}

void main()

{ struct LNode * head;int len;

head=(struct LNode *)malloc(sizeof(Node));

CreateList(head);len= ListLength ( head);

Printf("The length of List is % d",len)

}

2.2 常见错误分析

对于以上程序,初学者常见的错误有:

1) 指针没有指向任何内容就当作函数实参调用函数

有些初学者在调用CreateList(head)时没有对实参head赋值,只是声明了head是结构体指针。这时虽然实参和形参的类型相同,但实参没有指向任何具体的内存空间。如

void main()

{ 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不能正确执行。

2) 指针运算错误

在定义ListLength(struct LNode * L)时,将while循环中p指针指向下一个结点写成p++。

int ListLength ( struct LNode * L)

{ int i=0;struct LNode *q;q=L;

while (q){i++; p++;} return (i);

}

p++只能用在p指向一段连续的空间时,p指向下一个元素时用。在此程序中,p是指向链表中的某个结点,结点是动态分配的,结点与结点之间在空间上并不一定是连续的,所以p++之后,p并不一定指向下一个结点,所以下一个结点和下一个空间是完全不同的两个概念。正确的写法应该是“p=p->next;”。

3) 错误的指针赋值

void CreateList(struct LNode *L)

{ 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是引用L指向内容,q=*L是把L指向的结构体赋给了一个指针变量,赋值号两边的类型不一致。q->next=*p也是如此。正确的应该是q=L和q->next=p。

3 总结

指针是C语言的精髓,也是C语音学习的重点。指针数据类型使高级语言程序员可以按地址操作计算机内存,灵活实现一些特定功能;还可以使用指针方便地表达复杂的数据结构,使程序简洁、高效、紧凑。本文以实际链表操作为例,针对初学者在使用指针时经常出现的一些错误进行分析,希望能使初学者更快掌握指针的本质和用法。

参考文献:

[1] 张琳梅,尚永强.浅谈C语言中的指针[J].电脑知识与技术,2008(35):2546-2549.

[2] 谭浩强.C程序设计[M].北京:清华大学出版社,2005.

[3] 卢有杰,吴炜煜.C语言高级程序设计[M].北京:清华大学出版社,1999.

你可能感兴趣的:(c语言有关指针的程序)