您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 冶金工业 > 结构体指针变量的引用
C语言程序设计项目教程07任务七用指针实现查询、修改、添加、删除学生成绩学习情境在上一章中介绍了用结构体对学生成绩管理系统进行优化,这样可以让学生的信息作为整体进行处理,比起先前用多个数组表示更加容易理解。但是当进行变量复制、函数调用时,对于一个占用内存空间很大的结构体来说,需要将其复制是很浪费资源的,在本章里介绍一种方法——指针,指针可以很好的解决这个问题,只拷贝变量的地址而非变量自身。本章利用指针来对学生成绩管理系统进行代码优化。C语言程序设计项目教程第一部分任务学习引导7.1变量的指针与指针变量的概念7.2指针变量7.3指针与函数7.4指针与一维数组7.5指针与字符串7.6指针与结构体第二部分模块实现:用指针实现查询、修改、添加、删除学生成绩第三部分自学与拓展7.7其他类型的指针07任务七用指针实现查询、修改、添加、删除学生成绩C语言程序设计项目教程7.1变量的指针与指针变量的概念图中的最下面一行表示的是内存地址,这里的地址只是起示意作用,可以通过取地址符(&)来查看运行时分配的地址,这个地址就是指它的起始地址。通过起始地址就可以找到变量,因此也可以说,地址指向该变量。所以,在C语言中,变量的(起始)地址也被称为变量的指针,意思是通过它能找到以它为起始地址的内存单元。ab000000000000000000000000000000010011000110001001100210035000C语言程序设计项目教程将a赋值为1,系统将会根据变量名a查出它相应的地址1000,然后将整数1存放到地址为1000的内存单元(从1000开始向下分配4B);将b赋值为'1',系统将会根据变量名b查出它相应的地址5000,然后将字符'1'存放到地址为5000的内存单元(从5000开始向下分配1B),如图7-1所示。这种直接按变量名、不需要知道其具体分配的内存地址而进行的访问,称为直接存取。7.1变量的指针与指针变量的概念C语言程序设计项目教程7.2指针变量在C语言中,还有一种特殊的变量,它只是用来存放内存地址的。如图7-2所示,可以将a的地址1000存放到这种变量pa中,而后通过pa来存取a,这种存取方式叫做间接存取。这种用来存放地址的变量就称为指针变量。图中的箭头就表示“指向”,即在pa和a之间建立一种联系,通过pa就能知道a的地址,从而找到a的内存单元。这里pa就是指针变量,而变量pa存放的就是变量a的指针(地址)。100011000apaC语言程序设计项目教程1.指针变量的定义如上所述,指针变量就是用来存放变量的地址的变量。其定义的一般形式为:数据类型名变量名;其中,星号“”表示这是一个指针变量,变量名即为定义的指针变量名,数据类型名表示本指针变量所指向的变量的数据类型。例如,intp;表示p是一个指针变量,它的值是某个整型变量的地址,或者说p指向一个整型变量。至于p究竟指向哪一个整型变量,应由向p赋予的地址来决定。以如下定义为例对指针变量的定义应注意两点:inta,pa;charpc;/pc是指向字符变量的指针变量/doublepd;/pd是指向浮点变量的指针变量/7.2指针变量C语言程序设计项目教程①指针变量名a是整型变量,pa是指向整型变量的指针变量。与定义普通变量a不同,指针变量前面的星号“”表示该变量为指针型,不能把p当作是整型变量。②指针的基类型pa是指向整型变量的指针变量,那么整型则被称之为指针的基类型,也就是说pa只能存放整型变量的地址,而不能是其他类型变量的地址。这是因为在本章后面涉及指针变量的移动和计算时,指针一次移动的是一个内存单元,而每一种数据类型所占的内存单元并不一致,如对整型而言,一次移动4B,而对字符型来说,一次只移动1B。所以这时为了保证数据的准确性,规定一个指针变量只能指向同类型的变量,如pa只能指向整型变量,不能时而指向一个整型变量,时而又指向一个字符变量。7.2指针变量C语言程序设计项目教程2.指针变量的初始化先来介绍两个有关的运算符:&:取地址运算符。/使用方法:&变量名/:指针运算符。/使用方法:指针变量名/地址运算符“&”来表示取变量的地址,实际上是变量的起始地址。指针运算符“”表示取指针变量所对应内存单元的值。二者可以看作是一对互逆运算符。例如:inta;intpa=&a;pa赋给了a的地址,那么pa就是变量a。即(&a)等效于a;&(pa)就是a的地址。同普通变量一样,指针变量在使用之前需要先定义,而且它还必须赋予具体的值。如果在定义指针变量的同时,赋给其初始值,则称为指针变量的初始化。7.2指针变量C语言程序设计项目教程初始化的一般形式为:数据类型名变量名=初始地址值;例如:inta;charc;intpa=&a;charpc=&c;7.2指针变量C语言程序设计项目教程对于指针变量的初始化,应该注意以下几点问题。①上面的语句中,是将&a、&c赋给了指针变量pa、pc,而不是pa、pc,因为pa、pc指的是指针pa、pc所指向的内存单元的值,即a、c,而且这里的星号是起到表明变量为指针类型的作用。语句intpa=&a;等价于intpa;pa=&a;②指针变量指向的数据类型必须与指针的基类型一致,原因见上节指针的基类型所述。即不能写成charpc=&a;7.2指针变量C语言程序设计项目教程对于指针变量的初始化,应该注意以下几点问题。③可以将一个指针的值赋给同一基类型的另一指针变量。例如:inta;intpa=&a;intqa=pa;如图所示,pa指向变量a,然后又把pa的值1000赋给了qa,使qa也指向变量a。paaqa10001100010007.2指针变量C语言程序设计项目教程对于指针变量的初始化,应该注意以下几点问题。④当把一个变量的地址作为初始值赋给指针变量时,这个变量必须在指针初始化之前定义过。因为没定义过的变量,系统没有给其分配过内存空间,所以也就没有地址,就无法让指针指向该变量。⑤指针变量的赋值只能赋予地址,决不能赋予任何其他数据,否则将引起错误。在C语言中,变量的地址是由编译系统分配的,对用户完全透明。例如下述语句是错误的。intpa=1000;这里1000只是一个普通的整型数值,不能代表地址。7.2指针变量C语言程序设计项目教程对于指针变量的初始化,应该注意以下几点问题。⑥可以给一个指针变量初始化为“空”值。intpa=NULL;或者intpa=0;或者intpa='\0';这里的NULL是在头文件stdio.h中预定义符,其含义就为0。而pa也不是指向地址为0的内存单元,而是指向一个确定的值——“空”。如果通过一个空指针去访问一个内存单元,将会得到一个出错的信息。7.2指针变量C语言程序设计项目教程3.指针变量的引用在定义了一个指针变量并确定了其指向后,就可以用来访问所指向的变量。引用指针变量的一般形式为:指针变量名这里的星号()称为指针运算符,也称作间接访问运算符。7.2指针变量C语言程序设计项目教程3.指针变量的引用【例7-1】输入两个数,逆序输出。#includestdio.hvoidmain(){inta,b,pa,pb;pa=&a;pb=&b;scanf(%d%d,&a,&b);printf(正序输出:%d%d\n,pa,pb);pa=&b;pb=&a;printf(逆序输出:%d%d\n,pa,pb);}7.2指针变量C语言程序设计项目教程3.指针变量的引用程序说明:(1)在输入语句中,可以用pa、pb代替&a、&b。(2)这两条输出语句一样,却有不同的结果,是因为正序输出时,pa指向了a,pb指向了b,而后改变了指向,这时pa即为(&b),也就是变量b,同样的原因,pb此时即为a。如图7-4所示,只是指针指向发生改变,而并没有改变a和b本身的内容。7.2指针变量C语言程序设计项目教程7.3指针与函数3.指针变量的引用函数的参数不仅可以是整型、浮点型、字符型、结构体型等数据,还可以是指针类型。指针变量作参数时是传址,就是将地址传送到被调用函数,从而达到直接改变主调函数中数据的作用。下面来讲述一下其主要作用。(1)指针可以起到改变主调函数中数据的作用在【例7-1】中,是用指针指向的改变来完成对两个数的输出,不影响到这两个数本身。这里来举例说明如何通过指针改变a和b的内容。C语言程序设计项目教程7.3指针与函数【例7-2】输入两个数,交换后输出。#includestdio.hvoidswap(intp,intq){intt;t=p;p=q;q=t;}voidmain(){inta,b,pa,pb;pa=&a;pb=&b;scanf(%d%d,&a,&b);printf(交换前:a=%d,b=%d\n,a,b);swap(pa,pb);printf(交换后:a=%d,b=%d\n,a,b);}C语言程序设计项目教程7.3指针与函数3.指针变量的引用程序说明:①主程序中将指针变量pa、pb的值传到子函数中,p=pa、q=pb,子函数通过取指针p的内容(p)改变变量a的值,通过q改变变量b的值,然后两者完成交换。这一过程如图7-5所示。C语言程序设计项目教程7.3指针与函数3.指针变量的引用a.进入子函数之前,有两个指针pa、pb分别指向a和b;b.进入子函数后,编译系统给指针变量p和q分配空间,将pa、pb的值赋给了p和q,让p和q也指向a和b,并且原来的指针依然保持;c.在子函数中将p和q所指向的值进行交换;d.从子函数返回到主函数中,编译系统收回指针变量p和q,pa、pb所指向的就是已经交换过的值。C语言程序设计项目教程7.3指针与函数3.指针变量的引用②可以直接将a、b的地址传送过去,而不需要定义指针变量。例如,主函数可以改写为:voidmain(){inta,b;scanf(%d%d,&a,&b);printf(交换前:a=%d,b=%d\n,a,b);swap(&a,&b);printf(交换后:a=%d,b=%d\n,a,b);}C语言程序设计项目教程7.3指针与函数3.指针变量的引用③不能企图通过改变指针形参的值而使指针实参的值改变。例如,对【例7-2】中的子函数进行如下改写,是不能交换a和b的值的。voidswap(intp,intq){intt;t=p;p=q;q=t;}其中的问题在于不能实现如图7-5所示的第3步(c)。它在子函数中只是交换了指针的指向,并未交换a和b的值。所以当回到了主函数时,子函数的指针变量消失,而主函数中的pa、pb依然指向原来的a、b值。C语言程序设计项目教程7.3指针与函数3.指针变量的引用(2)指针可以起到返回多个值的作用通过函数章节的学习可知函数可以没有返回值或者有1个。如果需要多个返回值时,可以通过多构造几个子函数来完成,这样又会增加程序的复杂性,而通过指针可以很容易的返回多个值。C语言程序设计项目教程7.3指针与函数3.指针变量的引用【例7-3】输入3个数,找其最大值和最小值。#includestdio.hvoidfun(inta,intb,intc,intmax,intmin){max=min=a;/将最大值、最小值都先给初值a/if(bc){max=(maxb)?max:b;min=(minc)?min:c;}else{max=(maxc)?max:c;min=(minb)?min:b;}}C语言程序设计项目教程7.3指针与函数3.指针变量的引用【例7-3】输入3个数,找其最大值和最小值。voidmain(){inta,b,c,max,min;scanf(%d%d%d,&a,&b,&c);fun(a,b,c,&max,&min);printf(max=%d,min=%d\n,max,min);}C语言程序设计项目教程7.3指针与函数3.指针变量的引用程序说明:①max、min将地址传递给子函数,而a、b、c将值传递给子函数,由此可以看到,在传址时,子函数中的指针变量还要找地址对应的变量,比直接传值代价更高,但也能带来好处,譬如精简程序、返回多个值、改变调用函数中的
本文标题:结构体指针变量的引用
链接地址:https://www.777doc.com/doc-1854395 .html