admin 管理员组

文章数量: 887021


2023年12月20日发(作者:余切函数的性质与图像)

S0FTWARE DEVEL0PMENT AND DESIGN 软件开发与设计 C语言中的指针 魏扬 (四川理工学院,自贡643000) 摘要:指针是C语言的精华部分,也是C语言学习的重点和难点,正确而灵活地应用指针是学习C语言中最重要 的环节,也是掌握C L ̄-  z-的一个标志。本文从指针的概念、运算、误用以及与数组和函数的关系 ̄-+A-面对C语言 指针进行了分析和探讨。 关键字:C语言;指针;运算;数组;函数 The Pointer of C Language WEI Yang (Sichuan University of Science&Engineerng,Zigong 643000) 【Abstract】A correct and lfexible use of pointer,a diiculft and key points as well as the essence of C language,is the most important part in C Language and the indication as a C Language programmer.In this paper,the pointer of C Language is analyzed and discussed from concept,operation,misuse and the relationship with array and function. 【Key words】C anguaLge;pointer;operation;array;function C语言是计算机程序设计语言中专业性最强的语言之一, 其中指针是C语言中的精髓,它在C语言编程中被广泛的使 用。在某些场合,指针是使运算得以解决的唯一途径,同时 正确而灵活的掌握运用它,可以提高程序的运行速度,从而 有效地表示和实现复杂数据结构。 P一一 P+i P—i //D指向前一个对象 ,/当前对象后第i个对象 //当前对象前第i个对象 P+=i P一=i ,,D指向当前对象后第i个对象 ,,D指向当前对象前第i个对象 2.3两个指针变量相减 1 概念 C语言中处理变量、数组、函数、文件时,需要由操作系 统把这些量调入内存的不同存储单元中,每个内存单元都对 若两个指针变量指向同一个数组的元素,则两指针变量 值之差是两个指针之间的元素个数再加上1。 2.4两指针变量比较 应着一个地址,计算机就是通过访问这个地址来存取对应单 元的内容。因此,地址又称为指针。C语言中的每种数据类型 在内存中存放所占用的存储单元数是固定的。从而根据数据 的第一个存储单元地址(首地址)及数据类型,计算机就可 以访问这个数据。变量对应的首地址称作变量的指针。指针 变量是用于存放某一类型变量地址的变量。指针变量的定义 形式:类型说明符 变量名;其中 表示一个指针变量,变量 若两指针指向同一个数组的元素,则可以进行比较。指 向前面的元素的指针变量值小于指向后面元素的指针变量值。 2.5其它运算 p ,/取出P所指的内容 p++ ,/先 p,再使P+1 ++P ,/先P+1,再 P ( p)++P,/所指向的内容加1 名即为定义的指针变量名,类型说明符表示本指针变量的数 据类型。例如:int t;p=&&t;*p=2008;P为指向整数型的 3 误用 3.1指针的初始化 指针变量,t为整数型变量,现将t的地址放到P中即使P指 向t的首地址,并对t赋值为2008。 没有赋值的指针内容是一个随机的地址值,如果把一个 数据写入该地址中,容易造成无法估计的错误,这种错误可 能会导致一些最隐匿、最难以跟踪的bug。该错误甚至会破坏 计算机操作系统,导致系统崩溃。因此,一定要在对指针应 用取内容操作符( )之前,将指针初始化为一个确定的、适 2 运算 2.1赋值运算 P=&i P=aP=a【i】 pl=p2P=NULL 锵变量i的地址赋给P //将数组a的首地址赋给P 数组a中下标为i的元素地址赋给P /粥指针变量p2的值赋给指针变量p1 锵指针P赋空值,即不指向任何对象 当的地址。例如:下列程序用于将键人的两个整数按大小顺 序输出。 swap(pl,p2) int pl, p2; 2.2指针变量/Jn/减一个整数 P++ //p指向下一个对象 { int木p; p= pl; 本文收稿日期:2008年9月21日 一_7一 

电脑编程技巧与维护 pl= p2; p2= p; } main() { int a,b; int pointerl,*pointer2; scanf(“%d,%d”,&a,&b) pointer=&a;pointer2=&b; if(a<b)swap(pointed,pointer2); prinff(0%d,%dO,a,b); } 这里swap函数的功能是实现指针p1,p2所指单元内容 互换,其中以 p为中间变量,这就犯了未定向就使用的错 误,根据C编译系统的规则,当swap函数发生调用时,系统 仅给指针P分配一个内存单元。而这一内存里存放的地址未 定。它可能是操作系统或其它用户区的某一内存地址,当运 行程序时,很可能使不属于本程序的某个内存内容被修改, 从而造成整个系统的崩溃。对swap函数可修改为如下形式: swap(pl,p2) int p1. p2; f int p; P= pl; pl= p2; 半p= ; } 3.2指针类型错误 main() f static int a【3] 【4]={1,2,3,4,5,6,7,8,9,10,11, l2}; int ; for(p=a;p<a+12;p++) printf C%dtt, P);} 这里将p--a【0]错用为p=a,虽然a【0】和a的值相同, 但a是二级int型指针,而a[0】是一级int型指针,二者指向 的对象不同,类型不同,P只能接受a【O】。如果写成:“p= ¥a;或p= (a+O);或p=&a【0】【0]’,也是可以的。 main() {static int a【3]【4]={1,2,3,4,5,6,7,8,9,10,11, l2}; int i,j,( P)【4】;p=a【0】; ofr (i=0;i<3;i++) for (j=0;j<4;j++) printf C%d.T, ( p+i)+j));} 这里将p=a错用为p=a『0],因为类型不匹配,P是指向 行的指针,应赋行地址。 3.3指针偏移 main() {char P,S【8O]; p=s; do{gets(S); while( p)printf(”%xh”, p++); }while(stramp(S,”end”);} 一8一 这里,指针初始化p=s,进入循环后P自加,使得P的指 针移到字符串的其它部分,甚至移出字符串指向另一变量或 程序代码,这很危险。要把“p=s;”放在do循环之中,使P 自加操作后复位。 4 指针与数组 4.1指针数组与数组指针 指针数组,其本质是一个数组,即由指针构成的数组, 数据类型是指针类型,说明数组的每个元素都是一个指针变 量。如:int P[n];根据优先级关系[】高于 ,所以P先与 [n]组合,说明P是一个一维数组,长度为n,P前面的 是 标记符号的作用,表示P数组不是一般的数组,而是指针数 组,数组元素的值是用来存放其他变量的地址,n表示指针变 量的个数为i1。 数组指针,其本质是一个指针变量,而且这个指针变量 是专门用来指向数组的,即指向数组的指针。如:int( p) [n];0与[】的优先级相同,从左至右结合,( p)先组合说 明只有一个指针变量P,后面的[I1】表示指针变量P用来指向 一个带有n个元素的一维数组,指针变量的个数为1。 4.2用指针访问数组 C语言规定:如果指针变量P已指向数组中的一个元素, 则p+l指向同一数组中的下一个元素。例如有以下定义:int dates[4], P:则dates+2=&dates【2]; (dates+2)=dates【2】 进一步推广,若有p=&dates[n】;那p+i就指向dates【n+i】; (p+i)与dates【n+i1等价;p-i则指向dates[n—i]; (p-i)与 dates【n—i]等价;在程序设计中,数组既可以用下标访问,也 可以用指针来访问。以下两个函数均为计算整型数组中各元 素值的总和。 (1)函数1 int array—sum(int array,int n) { int sum=O, p; int array—end=array+n ofr(p=array;p<array_end;p++) sum+= p; return(sum); } (2)函数2 int arraysum(int array,int 11) { int sum=O; inti; for(j-O;i<n;j++) sum+=array[i】; return(sum); } 表面看来,函数2似乎比函数1简单。但是C语言的编 译程序通常会将其中array[i】处理为 (array+i),每次都要增 加一次加法运算,这与函数1中 p比较,效率自然低一些。 这正是为什么在C语言中经常使用指针访问数组元素的主要 原因。 (下转到21页) 

S0F ARE DEVEL0PMENT AND DESIGN 密。系统采用两种方法对ASP页面进行加密。一是使用组件 技术将编程逻辑封装入DLL之中;二是使用微软的ScriptEn— 软件开发与设计 现,无疑会使传统以手工为主的办公方式和办公手段,向标 准化、科学化、规范化、高效化、信息化转变。可以预计, 随着办公信息量的增加和信息化程度的提高,电子办公将成 为未来办公的发展方向。 coder对ASP页面进行加密。使用组件技术存在的主要问题是 每段代码均需组件化,操作比较繁琐,工作量较大,而使用 Encoder对ASP页进行加密,操作简单,收效良好。 参考文献 …1冯能山,李其艺.轻松学习一AsP网络实用编程【M].北 京:清华大学出版社,2002. [2傅寒冰,洪玫.办公自动化系统中的安全机制及其实现 2]【J].伊犁师范学院学报,2003;(1):104—107. 作者简介 ScfiptEncoder的运行程序是SCRENC.EXE,使用方法是: SCRENC[,s】 [/fl [/xl】 【/ldefLanguage】 [/edefExten- tion】inputifle outr’utfile 其中:/s是屏蔽屏幕输出;/f指定输出文件是否覆盖同 名输入文件;/xl指是否在.asp文件的顶部添加@Language指 令; ̄defLanguage指定缺省的脚本语言;/edefExtenfion指定待 加密文件的扩展名。 刘淼,男(1980一),湖南长沙人,助理工程师,主要从事电 4 结语 基于B/S模式开发的企业“出差五定单管理系统”的实 力信息通信系统运行和维护工作。 商涛,男(1978一),贵州兴义人,工程师,主要从事电力信 息通信系统运行和维护工作。 (上接第8页) 西改变了,但没有影响到ptr指针,ptr指针指向的还是它原 来的数据,只是P指针的数据改变了。引入一个指针的指针, 5 指针与函数 在C语言的函数调用中,所有的参数传递都是使用“值传 递”,如果在被调用函数中改变了形参的值,对调用函数中 的实参没有影响。一般变量作函数参数时,主要通过函数中 的retum语句,将一个函数值带回到调用函数,如果想要得 到几个返回值,必须通过全局变量。使用指针作为函数参 数,就可以通过函数调用改变调用函数中指针所指向的地址 让P指针指向p【r这个指针,这时候动态的分配的数据块传给 p,这个 p就是ptr,所以给ptr分配内存成功。 6 结语 指针是C语言中最为难学的一部分,也是C语言的精华 部分。只有很好地理解并活用指针,才能真正领悟C语言的 精髓所在,并且编写出精练而高效的程序。本文阐述了如何 去理解好C语言中的指针,当然在理解的同时,需要结合个 的值。如: void getptr(int P,int nun) 人实际,多编程、多上机调试摸索,只要做到这些,也许指 针也并非那么难掌握。 {p=(inc )maccol(num sizeof(int)); return;} voidmain() {int ptr; int k: 参考文献 【1]谭浩强.C程序设计.【M】.北京:清华大学出版社,2001. 【2】钱能.c++程序设计教程.【M].北京:清华大学出版社, 200】. getptr(ptr,10); for(k--O;k<10;k++) 作者简介 {scanf(”%dtt,&ptr【k]);)) 魏扬,男(1983一),四川自贡人,助理实验师,主要从事软 件、网络技术方面的研究。 这个程序要求的是给ptr动态分配内存,所以当分配了一 块的内存,并且这个内存的首地址赋给P,这时候P指向的东 (上接第18页) 脑知识与技术,2007;02:481—482. [2]Andrew C.Stuart.Sudoku Creation and Grading;3rd February 2007. 6 结语 本文利用AutoCAD附带的二次开发工具AutoLISP语言, 模拟人工求解数独谜题(puzzle)的过程,编制了求解puzzle 的程序,通过AutoCAD交互界面作为数据输入、输出的辅助 [3]Andrew C.Stuart.Sudoku solver;http://www.scanraid.conffsu- doku.htm. 工具,方便用户使用。同时编制了puzzle生成程序,可产生 一【4】Method hierarchy;Sudoku Players Forums Forum Index一> Advanced solving techniques. 系列puzzle。此外,可通过几何变换得到不同的puz ̄e。对 于第二节中所列出的各式人工求解技巧(定式),已用Au— [5】Michael Mepham.SOLVING SUDOKU. toLisp实现,目前正在做进一步的整合工作。 【6]韦恩・古德.数独【M】南海出版公司,2006. 作者简介 参考文献 【1雷蕾,沈福可.关于数独问题的算法的设计与实现[1]J].电 张宗科,男(1973一),工程师,主要从事船舶设计与软件开 发工作。 一21— 


本文标签: 指针 变量 数组 语言 地址