探讨C语言中的指针和数组问题

时间:2022-10-06 05:17:49

探讨C语言中的指针和数组问题

摘要:针对C语言中的两大重点内容,结合实例,探讨了指针和数组在解决某些问题上的等价性,对不同层次和不同类型的C语言开发人员中有一定的指导意义。

关键词:C语言;指针;数组

中图分类号:TP311文献标识码:A文章编号:1009-3044(2010)19-5228-01

Studying the Pointer and Array Problem of C Language

LIU Wen-feng

(Computer and Information Engineering Department, Heze University, Heze 274015, China)

Abstract: Using examples and pointing the two highlights,this paper sdudys the pointer and array in solving some issues ,there is some degree equivalence; This paper has some guidance to the different levels and types of the C language developer.

Key words: C language; pointer; array

C语言课程,是计算机科学与技术以及相关学科专业的一门专业基础课。该课程学习掌握的好坏对后继课程有着非常重要的影响,而C语言课程中有两天非常重要的部分,一个是数组,另一个是指针。数组有一维数组、二维数组等,学生理解相对容易,写程序也很容易上手。而指针则是C语言课程中最难学习和掌握的内容,虽然花费了大量的时间,但是也很难熟练运用。

1 结合实例剖析指针和数组的特点

下面我们给出实例来剖析指针和数组的特点,在主函数中间填写一部分语句或使用单独的函数以实现以下功能,求出1到1000之内能被7或11整除但不能同时被7和11整除的所有整数并存放在数组aa中,并把满足条件的值存入OUT.DAT中(我们事先已经在相应的目录建好了一个空的记事本文件,文件名为OUT,扩展名改为.DAT格式),同时输出到执行屏幕上,我们使用两种方式分别加以实现。

1.1 基于指针的实现方法

首先使用指针来实现该函数的功能。

#include

#include //使用到的头文件

void writeDAT();//声明写函数

void countValue(int *a,int *n);//声明编写函数,变量均使用指针

void main()

{ int aa[1000],n,k;//定义所需变量

system("CLS");//清楚屏幕内容

countValue(aa,&n);//转入countValue执行

for(k=0;k

if((k+1) %10 ==0)

{printf("%5d",aa[k]);

printf("\n"); }

else printf("%5d",aa[k]);/*以上for语句是实现结果的屏幕输出*/

writeDAT();/*执行输出语句的函数*/}

void writeDAT()//写函数的具体实现

{ int aa[1000],n,k;

FILE *fp;//使用文件指针

fp=fopen("out.dat","w");//以写方式打开文件out.dat

countValue(aa,&n);//再执行一次countValue函数

for(k=0;k

if((k+1)%10==0)

{ fprintf(fp,"%5d",aa[k]);

fprintf(fp,"\n"); }

else fprintf(fp,"%5d",aa[k]);/*以上for语句是实现aa中的数据写入文件out.dat中,每行显示10个 */

fclose(fp);//关闭所打开的文件

}

以下是使用指针对函数countValue的具体实现。

void countValue(int *a,int *n) /*定义传递指针变量a为数组指针和n统计满足条件的个数指针*/

{ int i;

*n=0; //对指针变量所指内容赋初值

for(i=1;i

{if((i%7==0 && i%11!=0)||(i%7!=0 && i%11==0))/*如果i的值满足能被7整除同时又不能被11整除;或者i的值满足不能被7整除同时必须能被11整除。满足这两个条件之一即符合条件*/

{*a++=i;*n=*n+1;}}}

语句*a++=i,可以分为两句来实现。即*a=i,a=a+1;语句*a=i是把变量i的值存入指针a所指地址的变量空间中;语句a=a+1指的是指针变量a指向下一个数据单元。

1.2 基于数组的实现方法

以下是数组的实现方法。

#include

#include //使用到的头文件

void main()

{ FILE *fp;//定义文件类型指针

int i,aa[1000],n=0,k; //定义所需变量

system("CLS");//清楚屏幕内容

for(i=1;i

{if((i%7==0 && i%11!=0)||(i%7!=0 && i%11==0))/*如果i的值满足能被7整除同时又不能被11整除;或者i的值满足不能被7整除同时必须能被11整除。满足这两个条件之一即符合条件*/

{aa[n]=i;n++;}}//把满足条件的数据存入数组aa中,个数n值增1

for(k=0;k

if((k+1) %10 ==0)

{printf("%5d",aa[k]);

printf("\n"); }

else printf("%5d",aa[k]); //以上for语句是实现把结果输出到屏幕上

fp=fopen("out.dat","w");//以写方式打开文件out.dat

for(k=0;k

if((k+1)%10==0)

{ fprintf(fp,"%5d",aa[k]);

fprintf(fp,"\n");

}else fprintf(fp,"%5d",aa[k]); /*以上for语句是实现aa中的数据写入文件out.dat中,每行显示10个 */

fclose(fp); //关闭所打开的文件

}

数组实现相对较简单,也很容易理解和掌握。这种方法没有使用单独的函数,由于该函数简单,直接放到主程序当中来实现,当然也没有用到参数传递。避免了在参数使用和参数传递中的不必要的错误。

这两种方法,前一种方法使用参数传递,在参数传递和地址传递中,指针有其非常优越的特性,利用指针我们实现了相应功能。但在具体使用中,虽然语句较少,指针在理解和学习过程中相对复杂。如在函数中的参数传递过程中,对整型变量n的传递使用的是变量n的地址&n,而不是n本身;对数组aa[1000]在函数传递中使用整型指针a,而不是*a或&a。

2 结束语

目前很多已经成型的编程专家,在很多情况下都不使用指针,特别是在大型软件程序的开发中。因为指针非常灵活和方便,在具体使用中很容易出现引用错误和指向错误的问题,与此同时这些错误在调试和测试中又是很难被发现的。数组虽然没有指针灵活,但我们可以实现与指针相同的效果,例如很多国外的编程专家都不使用指针,而使用数组来替代它。这样就避免了很多不必要的麻烦。也不是说大家都不要学习指针了,都来学数组。如果你是软件开发的新手,建议少使用指针,当然如果你是多年的编程专家并且对C语言掌握的非常透彻,指针当然是较好的选择。

参考文献:

[1] 李明辉,丁海艳,万克星,等.全国计算机等级考试上机考试题库――三级网络技术[M].成都:电子科技大学出版社,2008.

[2] 谭浩强.C语言程序设计教程[M].3版.北京:高等教育出版社,2006.

[3] 徐磊.Linux系统下C程序开发详解[M].北京:电子工业出版社,2008.

[4] 杨将新.C语言开发全程指南[M].北京:电子工业出版社,2008.

上一篇:动态输出反馈控制器分频段设计 下一篇:安钢进口矿石业务管理系统的设计与实现