版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C语言程序设计第7章指针脉络导图C语言程序设计技能目标C语言程序设计(1)具有分析问题、解决问题的能力和项目团队合作能力。(2)掌握C语言程序设计模块化编程的思路。(3)掌握指针的定义和使用,以及指针作为函数参数的功能实现。(4)熟悉C语言中语法规则,具有程序运行调试与维护能力。素质目标C语言程序设计(1)通过指针学习,培养同学们高效处理问题的能力。(2)通过指针实现函数之间的共享变量或数据结构,培养同学们资源共享、团队合作的意识。7.1指针与指针变量C语言程序设计计算机硬件系统的内存储器中拥有大量的存储单元,当需要执行磁盘上的某一可执行程序时,操作系统负责将它调入内存。具体地说,内存中存放了程序中的语句、函数、常量、变量等。不同的语句、函数、常量、变量在内存中的位置是不同的。一般把存储器中的1字节称为一个内存单元,不同的数据类型所占用的内存单元数不等。为了正确地访问这些内存单元,必须为每个内存单元编号,然后根据内存单元的编号即可准确地找到该内存单元。内存单元的编号也叫作“内存地址”。指针的概念7.1指针与指针变量C语言程序设计“变量名”是给内存空间取一个容易记忆的名称,如同上网时的域名一样,可方便用户使用(实际上起作用的是IP地址);“变量地址”是系统分配给变量的内存单元的起始地址;“变量值”是变量的地址所对应的内存单元中所存放的数值或内容。变量名、变量地址和变量值7.1指针与指针变量C语言程序设计系统对变量的访问形式可分为直接访问和间接访问。(1)直接访问。要访问变量必须通过地址找到该变量的存储单元。由于通过地址可以找到变量单元,因此可以说一个地址“指向”一个变量存储单元。例如,地址2000指向变量a,地址2002指向变量b等。这种通过变量名或地址访问一个变量值的方式称为“直接访问”。(2)间接访问。“间接访问”方式是把一个变量的地址放在另一个变量中,利用这个“特殊”的变量进行访问。如图7-2所示,“特殊”变量p存放的内容是变量d的地址,利用变量p来访问变量d的方法称为“间接访问”。变量的访问形式7.1指针与指针变量C语言程序设计为了让读者更容易理解两种访问方式的实质和不同,不妨再打个比喻。假设为了开一个A抽屉,共有两种办法:一种是将A的钥匙带在身上,需要时直接找出A的钥匙打开抽屉,取出所需的东西,这相当于直接访问;另一种办法是为了安全起见,将A的钥匙放到另一个抽屉B中锁起来,若需要打开A抽屉,就需要先找出B钥匙,打开B抽屉后取出A钥匙,然后再打开A抽屉,最后才能取出A抽屉中的所需之物,这就是“间接访问”。两种访问方式的比较7.1指针与指针变量C语言程序设计名师点睛“指针”这个名词是为了形象地表示访问变量时的指引关系,不要认为在内存中真的有一个像时钟似的“针”在移动。一般说的指针,习惯上是表示指针变量,它实际上只是存放了一个变量的地址而已。7.1指针与指针变量C语言程序设计存放地址的变量称为指针变量。指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。C语言规定所有变量在使用前都必须定义,系统会按数据类型分配内存单元,所以指针变量必须定义为“指针类型”。指针变量定义一般格式如下:基类型 *指针变量名其中,“基类型”是该指针变量所指向的变量的类型,也就是指针变量所存储变量地址的那个变量的类型。例如,int *p; float*point1; char*point2;,分别定义了基类型为整型、实型和字符型指针变量p、point1和point2。指针变量7.1指针与指针变量C语言程序设计名师点睛(1)定义变量时,指针变量前的“*”是一个标志,表示该变量的类型为指针型变量。(2)指针变量存放某一类型变量的地址。而指针常量是指所引用的对象的地址不能改变的指针。7.1指针与指针变量C语言程序设计名师点睛(1)定义变量时,指针变量前的“*”是一个标志,表示该变量的类型为指针型变量。(2)指针变量存放某一类型变量的地址。而指针常量是指所引用的对象的地址不能改变的指针。7.1指针与指针变量C语言程序设计在C语言中,用指针来表示一个变量指向另一个变量这样的指向关系。那么如何使一个指针变量指向一个普通类型的变量呢?只要将需要指向的变量的地址赋给相依的指针变量即可。例如,int*p;int a=3;p=&a;就实现了指针变量p指向变量a。当然,指针变量也可将定义说明与初始化赋值合二为一,则上面的情况也可用inta=3;int*p=&a;实现。在定义一个指针变量后,编译器不会自动为其赋值,此时指针变量的值是不确定的。事实上,指针变量必须被赋值语句初始化后才能使用。空指针NULL是一个特殊的值,将空指针赋值给一个指针变量后,说明该指针变量的值不再是不确定,而是一个有效值,只是不指向任何变量。指针变量只能接收地址。例如,int*p,a=100;p=a;赋值方法是错误的。指针变量的初始化和赋值7.1指针与指针变量C语言程序设计在C语言中,变量的地址是由编译系统分配的,所以用户是不知道变量的具体地址。(1)指针运算符。取地址运算符&。该运算符是单目运算符,其结合性为自右至左,其功能是取变量的地址。取内容运算符*。页脚间接引用运算符,其结合性为自右至左,用来表示指针变量所指的变量。在*运算符后跟的变量必须是指针变量。指针变量的运算C语言程序设计【例7-1】验证运算符*和&的作用。运行结果语句编写
7.1指针与指针变量源代码见教材52,1052,1065fe0c,65fe0865fe0c,65fe087.1指针与指针变量C语言程序设计允许用于指针的算术操作只有加法和减法。若有定义:intn,*p;,表达式p+n(n≥0)指向的是p所指的数据存储单元之后的第n个数据存储单元,而不是简单地在指针变量p的值上直接加个数值n,其中数据存储单元的大小与数据类型有关。若指针变量p1是整型的指针变量,其初始值为2000,整型的长度是2字节,则表达式“p1++;”是将p1的值变成2002,而不是2001。每次增量之后,p1都会指向下一个单元。同理,当p1的值为2000时,表达式“p1--;”将p1的值变成1998。指针变量的运算7.1指针与指针变量C语言程序设计使用关系运算符<、<=、>、>=、==和!=,可以比较指针值的大小。如果p和q是指向相同类型的指针变量,并且p和q指向同一段连续的存储空间(如p和q都指向同一数组的元素),p的地址值小于q的值,则表达式p<q的结果为1,否则表达式p<q结果为0。参与比较的指针指向的空间一定在一个连续的空间内,比如都指向同一数组。指针变量的运算C语言程序设计【例7-2】输入a和b两个整数,按从大到小的顺输出两个数。运行结果语句编写
7.1指针与指针变量程序说明:该程序定义了3个指针变量p、p1和p2,在比较过程中,不是直接交换a与b的值,而是通过交换指针变量的指向来实现的。最初指针变量p1和p2是分别指向变量a和b,当a小于b时,通过交换指针指向,使指针变量p1转而指向b,p2指向了a。源代码见教材37a=3,b=7max=7,min=37.1指针与指针变量C语言程序设计函数的参数不仅可以是整型、实型和字符型,还可以是指针类型。当是指针类型时,它的作用是将一个变量的地址传送到另一个函数中。在C语言中,函数参数的传递时单向值传递。数值只能从调用函数向被调用函数传递,不能反过来传递,形参值的改变不会反过来影响实参的改变。例7-3就试图用一个被调函数实现主调函数中变量值的改变,但这是无法实现的。指针变量作函数的参数C语言程序设计【例7-3】试图交换变量值的程序。运行结果语句编写
7.1指针与指针变量程序说明:此例中,i和j的值正确传入了swap()函数中,a和b是swap()函数的两个形参。a和b的值是由i和j复制得到的,是i和j的一个副本。在swap()函数调用返回时,a和b两个形参的生命周期结束,但它们的值并没有被复制回实参i和j中。因此,一旦返回,i和j的值将保持不变,swap()函数的交换功能也没有得到体现。源代码见教材beforecalling:i=133j=58inthefunctionswap:a=58b=133aftercalling:i=133j=587.1指针与指针变量C语言程序设计解决问题的方法是用指针作为函数参数,传给swap()函数的应是想交换的两个变量的地址,而地址可用指针来实现。解决方法C语言程序设计【例7-4】使用指针参数将改变带回到调用函数。运行结果语句编写
7.1指针与指针变量程序说明:使用指针作为参数,函数改变参数的值后,能将改变带回到调用函数。swap()函数的参数是两个指向整型变量的指针变量。所以main()函数在调用时必须使用&i、&j来传递参数。源代码见教材beforecalling:i=133j=58inthefunctionswap:*a=58*b=133aftercalling:i=58j=133C语言程序设计【例7-5】输入a、b和c三个数,按由大到小的顺序输出。运行结果语句编写
7.1指针与指针变量程序说明:这里限定了swap()函数、exchange()函数的返回类型是void,因此,要得到输出值就务必传递一个数值的地址。总之,若希望通过函数调用改变一个或多个变量的值,可以采用传送相应变量地址的方法。源代码见教材78173378,33,177.2指针变量的应用C语言程序设计一个变量有地址,一个数组包含若干元素,每个数组元素都在内存单元中占用存储单元,它们都有相应的首地址。数组名是数组的首地址(不能说是数组元素的首地址),针对同一个数组来说,它是一个常量。所谓数组的指针,是指数组的起始地址,事实上也就是数组名。一个数组是由连续的一块内存单元组成的,数组名就是这块连续内存单元的首地址。一个数组也是由各个数据元素(下标变量)组成的,每个数组元素按其类型的不同占用不同个数的连续的内存单元,指针变量既然可以指向一般变量,当然也可以指向数据元素,数组元素的指针是数组元素的地址。一个数组元素的首地址也是指它所占用的几个内存单元的首地址。指向一维数组的指针变量7.2指针变量的应用C语言程序设计数组中各个元素的地址又是如何计算和表示的呢?如果有一个数组a,其定义为:inta[5]={1,3,5,7,9};,元素a[0]的地址是a的值(即1010),元素a[1]的地址是a+1。同理,a+i是元素a[i]的地址。值得特别注意的是,此处的a+i并非简单的在首地址a上加个数字i,编译系统计算实际地址时,a+i中的i要乘上数组元素所占的字节数,即实际地址=a+i×单个元素所占的字节数。其中,单个元素所占的字节数由数据类型决定。指向一维数组的指针变量7.2指针变量的应用C语言程序设计为了引用一个数组元素,可以用两种不同的方法:一种是下标法,即指出数组名和下标值,系统会找到该元素。例如,a[3];另一种方法是指针法,也叫地址法,就是通过给出的数组元素地址访问某一元素。例如,通过地址a+3可以找到数组元素a[3],而*(a+3)的值就是元素a[3]的值。(1)下标法。用a[i]的形式访问数组元素。前面介绍数组时都采用的这种方法。(2)指针法采用*(a+i)或*(p+i)的形式,用间接访问的方法来访问数组元素,其中a是数组名,p是指向数组a的指针变量。指向一维数组的指针变量C语言程序设计【例7-6】用下标法输出数组中的全部元素。运行结果语句编写
7.2指针变量的应用源代码见教材a[0]=0a[1]=1a[2]=2a[3]=3a[4]=4C语言程序设计【例7-7】用指针法输出数组中的全部元素。运行结果语句编写
7.2指针变量的应用源代码见教材a[0]=0a[1]=1a[2]=2a[3]=3a[4]=47.2指针变量的应用C语言程序设计C语言规定:若p为指向某一数组的指针变量,则p+1指向同一数组中的下一个元素。例如,intarray[10],*pointer=array;,则:(1)pointer+i和array+i都是数组元素array[i]的地址,如图7-4所示。(2)*(pointer+i)和*(array+i)就是数组元素array[i]。(3)指向数组的指针变量被赋值为数组名后也可按下标法来使用。例如,array[i]等价于*(pointer+i)。通过指针引用数组元素7.2指针变量的应用C语言程序设计名师点睛1)数组名是指针变量,始终是指向数组的首地址;而指针是一个变量,可以实现本身值的改变。如有数组a和指针变量p,则以下语句是合法的。p=a;p++;p+=3;而“a++;”与“a=p”都是错误的。(2)在使用中应注意*(p++)与*(++p)的区别。若p的初值为a,则*(p++)的值等价于a[0],*(++p)等价于a[1],而(*p)++表示p所指向的元素值加1。如果p当前指向a数组中的第i个元素,则有:“*(p--);”等价于“a[i--];”;“*(++)p;”等价于“a[++i];”;“*(--p);”等价于“a[--i];”。C语言程序设计【例7-8】分析程序的运行结果。运行结果语句编写
7.2指针变量的应用程序说明:从程序运行结果中可以看出,a[i]、*(a+i)和*p输出的结果都是相同的。源代码见教材2468102468102468107.2指针变量的应用C语言程序设计指向字符串的指针称为字符串的指针,其类型是char*或unsignedchar*。实际上,只要知道字符串的首地址的指针,就可以通过指针的移动来存取字符串中的每一个字符,直至移动到字符串结束标志'\0',因此可以用字符串指针来表示字符串。用字符数组来存储字符串时,数组的指针就是字符串指针。指向字符串的指针变量C语言程序设计【例7-9】字符数组的应用。运行结果语句编写
7.2指针变量的应用程序说明:字符数组s长度没有明确定义,默认的长度是字符串中字符个数加1的和(结束标志占一个字符位),s数组的长度应该是14。s是数组名,表示字符数组首地址;s+4表示序号为4的元素的地址,指向字符'k'。s[4]与*(s+4)表示数组中序号为4的元素的值(k)。字符数组允许用%s格式进行整体输出。源代码见教材ILoveChina!C语言程序设计【例7-10】字符指针的应用。运行结果语句编写
7.2指针变量的应用程序说明:C程序将字符串常量"ILoveChina!"按字符数组处理,在内存中开辟一个字符数组来存放字符串常量,并把字符数组的首地址赋值给字符指针变量s。源代码见教材ILoveChina!C语言程序设计【例7-11】用字符指针指向一个字符串。运行结果语句编写
7.2指针变量的应用程序说明:程序中定义了一个字符数组string,并对它进行了赋初值。p是指向字符数据的指针变量,将string数组的起始地址赋给p,p也指向了字符串。最后,程序以“%s”格式输出string和p,从给定的地址开始逐个字符输出,直到遇到'\0'为止。结果都是输出字符串"ILoveChina!"。源代码见教材ILoveChina!ILoveChina!7.2指针变量的应用C语言程序设计使用字符数组和字符指针都能处理字符串,但二者之间是有区别的,主要表现在以下3个方面。(1)字符数组由若干个元素组成,每个元素中放一个字符,若用来处理字符串,则必须保证有串结束符。而字符指针变量用来存放字符串的首地址(若未进行初始化,则它指向的地址是不确定的),不是用来存放整个字符串内容的。(2)赋值方式不完全相同,字符数组只能对各个元素赋值,不能整体赋值。(3)在说明一个字符数组后,其地址是确定的,而说明一个字符指针变量时,指针变量的值是可以改变的。指向字符串的指针变量C语言程序设计【例7-12】编程实现删除有序数组中重复元素。运行结果语句编写
7.2指针变量的应用程序说明:首先遍历整个数组,统计出重复元素的位置和个数,然后通过移动指针删除重复元素。源代码见教材12344456671234567C语言程序设计【例7-13】统计其中大写字母、小写字母、数字、控制及其他字符的个数。运行结果语句编写
7.2指针变量的应用程序说明:输入一个字符串后,可将一个字符型指针p指向该字符串首地址。当p所指字符不能与字符串结束标志'\0'不相等时,使用复合if语句判断p所指字符是哪类字符,然后将对应的变量自加,然后将指针P后移。直到循环结束,输出这些字符个数即可。源代码见教材请输入一个字符串(不要超过100个字符):WinterDream-EmblemoftheOlympicWinterGamesBeijing2022该字符串中大写字母个数为:7该字符串中小写字母个数为:40该字符串中数字个数为:4该字符串中空格个数为:10该字符串中其他字符个数为:17.3常见错误分析C语言程序设计对指针变量赋予非指针值#include<stdio.h>intmain(){ inti=10,*p; p=i; /*对指针变量赋予非指针值*/ printf("%d",*p); return0;}7.3常见错误分析C语言程序设计指针未能指向确定的存储区#include<stdio.h>intmain(){ char*str; scanf("%s",str); /*企图从键盘输入一个字符串,使str指向该字符串*/ printf("%s",str); retur
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年首期款全付房产买卖合同书3篇
- 二零二五版个人信用重建借款委托担保合同3篇
- 二零二五版包装行业绿色认证与推广合同3篇
- 二零二五年陵园墓地购置与家族纪念馆建设合同3篇
- 二零二五版知识产权保护技术服务合同泄密责任细则3篇
- 二零二五年度餐饮企业食品安全追溯平台建设合同3篇
- 二零二五年度食品供应与餐饮服务合同2篇
- 二零二五年防火门制造与施工安装一体化合同模板3篇
- 2025年度影视基地场地租赁及拍摄制作合同范本3篇
- 2025年复合材料堆放场地租赁及环保处理合同3篇
- 建筑材料供应链管理服务合同
- 孩子改名字父母一方委托书
- 2024-2025学年人教版初中物理九年级全一册《电与磁》单元测试卷(原卷版)
- 江苏单招英语考纲词汇
- 矿山隐蔽致灾普查治理报告
- 2024年事业单位财务工作计划例文(6篇)
- 2024年工程咨询服务承诺书
- 青桔单车保险合同条例
- 车辆使用不过户免责协议书范文范本
- 《狮子王》电影赏析
- 2023-2024学年天津市部分区九年级(上)期末物理试卷
评论
0/150
提交评论