C语言电子教案第8章__指针课件

PPT
  • 阅读 46 次
  • 下载 0 次
  • 页数 47 页
  • 大小 215.500 KB
  • 2022-11-13 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
C语言电子教案第8章__指针课件
可在后台配置第一页与第二页中间广告代码
C语言电子教案第8章__指针课件
可在后台配置第二页与第三页中间广告代码
C语言电子教案第8章__指针课件
可在后台配置第三页与第四页中间广告代码
C语言电子教案第8章__指针课件
C语言电子教案第8章__指针课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 47
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】C语言电子教案第8章__指针课件.ppt,共(47)页,215.500 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-7145.html

以下为本文档部分文字说明:

第8章指针1.掌握指针的基本概念和指针变量的使用;2.理解一维数组与指针的关系;3.理解函数与指针之间的关系;4.利用指针进行字符串的处理。8.1指针和指针变量的概念8.2指针变量的定义与引用8.3数组的

指针和指向数组的指针变量8.4字符串的指针和指向字符串的指针变量8.5返回指针值的函数8.6指针数组与主函数main的形参8.7函数的指针和指向函数的指针第8章指针8.1指针和指针变量的概念“指针”是个与地址相关的概念,

指针本身不是变量,也不分配存储单元,它只表示对象在内存中的地址。也就是说,一个变量所占内存空间的地址称为该变量的指针。1.内存地址──内存中存储单元的一个地址的编号2.变量地址──系统分配给变量的内存空间(一个或多个地址)的起始地址8

.1指针和指针变量的概念例8.1变量与地址#include<stdio.h>voidmain(){intn;charch=’A’;printf(“Inputthenumber:”);scanf("%d",&n);printf("n=%d\n",n);printf("

ch=%c\n",ch);}8.1指针和指针变量的概念内容000341·······地址FF00FF01FF02FF03idaddressnFF00chFF02····························(1)实际存储(2)符号表8.1指针和指针变量的概念3.变量值的存取─

─通过变量在内存中的地址进行直接访问──直接利用变量的地址进行存取间接访问──通过指针变量访问该变量的值8.1指针和指针变量的概念例8.2指针变量的值与地址#include<stdio.h>voidmain(){intn;int*p;n=3;p=&n;printf("n=%d\n",n

);printf("p=%d\n",*p);}8.1指针和指针变量的概念内容0003FF00地址FF00FF01FF02FF03idaddressnFF00pFF02····························(1)实际存储(2)符号表8.1指针和指针变量的概念#inc

lude<stdio.h>voidmain(){inta,b,sum;printf("请输入a,b的值:");scanf("%d,%d",&a,&b);sum=a+b;printf("sum=%d\n",sum);}#include<stdio.h>v

oidmain(){inta,b,sum=0;int*p_1,*p_2;printf("请输入a,b的值");scanf("%d,%d",&a,&b);p_1=&a;p_2=&b;sum=*p_1+*p_2;printf("sum=%d\n",sum);}练习:输入下面的程序,观察运行

结果,并进行分析。8.1指针和指针变量的概念4.指针与指针变量(1)指针──即地址一个变量的地址称为该变量的指针。通过相同类型变量的指针能够找到该变量。(2)指针变量──专门用于存储地址的特殊变量指针变量p的值就是变量n的地址。指针与指针变量的区别,就是变量值与变量的区别。8.2指针变量的定义

与引用8.2.1指针变量的定义与相关运算在C语言中,用符号“*”表示“指向”,反映指针变量与它所指的变量之间的联系,在变量类型说明中,变量前加“*”用于区别于普通变量。定义指针变量的一般形式为?类型标识符*指针变量[,*指针变量2……];8.2指针变量的定义

与引用其实指针定义和定义一般变量比较,除变量名前多了一个星号“*”(指针变量的定义标识符)外,其余都一样,不过指针变量在一个系统中占的空间时?一样的,一般为2个字节,指针内的地址可用%x以16进制输出。例如:int*p1;上边的指针并未指向

某个具体的变量(称指针是悬空的,地址时随机的)。使用悬空指针因为不知道指向的是什么地方,要是指向系统文件占用的内存很容易破坏系统,导致系统瘫痪。8.2指针变量的定义与引用和指针相关的还有一个“&”符号。&运算符返回操作对象的内存

地址。指针变量通过&的赋值语句,指向该操作对象。取地址运算的格式:&变量名例如:intn=3,*p;p=&n;&n的结果,就是返回变量n的地址。然后用赋值运算赋给指针变量p。8.2指针变量的定义与引用例8.3指针变量的定义和引用示例。程序运行结果:integer:i=123,*p1,=

123,addr=fff4float:f=3.140000,*p2=3.140000,addr=fff0char:ch=A,*p3=A,addr=ffef8.2指针变量的定义与引用这个程序使用直接访问和间接访问两种方式,分别输出变量i、f

、ch的值。并且输出了他们的地址,由于机器和系统不同,最后的地址可能会有变化,但不影响理解程序。指针变量之间和一般变量一样,也可以进行赋值运算,但是它们之间赋值不需要取地址运算符”&”。例如有2个指针变量p1和p2,执行p2=p1;操作后p2指针就指向p1

所指向的地址,以后p1发生变化后p2不变。大家看下例:8.2指针变量的定义与引用例8.4使用指针变量求解:输入2个整数,按升序(从小到大排序)输出。程序运行结果:Inputthefirstnumber:8↙Inputthesecondnumber:3↙a=8,b=3min=3,max=88.2指

针变量的定义与引用8.2.2指针变量作函数参数指针变量既可以作为函数的形参,也可以作函数的实参。指针变量作实参时,与普通变量一样,也是“值传递”,即将指针变量的值(一个地址)传递给被调用函数的形参(必须是一个指针变量)。被调用函数虽然不能改变实参指针变量的值,但可以改变实参指针

变量所指向的变量的值。8.2指针变量的定义与引用例8.5使用函数调用方式改写例8.4,要求实参为指针变量。程序运行结果:Inputthefirstnumber:8↙Inputthesecondnumber:3↙a=8,b=3a=3,b=88.2指针变量的定

义与引用在进行指针作为参数传递时,需注意以下几点:为了利用被调用函数改变的变量值,应该使用指针(或指针变量)作函数实参。其机制为:在执行被调用函数时,使形参指针变量所指向的变量的值发生变化;函数调用结束后,通过不变的实参指针(或实参指针变量)将变化的

值保存下来。8.2指针变量的定义与引用例8.6输入3个整数,按降序(从大到小的顺序)输出。要求使用变量的指针作函数调用的实参来实现。程序运行结果:Inputthefirstnumber:9↙Inputthesecondnumber:6↙Inputthethirdn

umber:12↙n1=9,n2=6,n3=12排序结果:12,9,68.3数组的指针和指向数组的指针变量指向数组的指针就是数组在内存中的起始地址,指向数组内元素的指针就是数组元素在内存中的起始地址。指向数组的指针变

量的定义,与指向普通变量的指针变量的定义方法一样。由于数组名可以看作不变的指针,它代表数组在内存中的起始地址(与第1个元素的地址相同),所以可以用数组名给指针变量赋值。而不必用取地址符“&”。8.3数组的指针和指向数组的指针变量例如,intarray[10],*p;p=array;(或*p=&

array[0];)这里p=array;和*p=&array[0];在运行上是一样的。数组元素的引用,一般采用下标法,其实还可以使用指针法。使用下标法,直观,但系统运行时由于要进行地址的运算所以占用内存多、运行速度相对较慢;而使用指针法,能使目标程序占用内存少、运

行速度快。8.3数组的指针和指向数组的指针变量通过指针引用数组元素指针和数组名都可以引用数组元素。假设有“intarray[10],*p;p=array;”,则:*(p+i)和*(array+i)就是数组元素array[i

]。p+i和array+i都是数组元素array[i]的地址。指向数组的指针变量,也可将其看作是数组名,因而可按下标法来使用。例如,p[i]等价于*(p+i)。这里要强调一点:p+1指向数组的下一个元素,而不是简单地使指针变量p的值+1(地址加

一个字节)。其实际变化为p+1*size(size为一个数组元素占用的字节数,例如整型是两个字节)。8.3数组的指针和指向数组的指针变量指针的方法#include<stdio.h>voidmain(){inta[5]={10,20,30,40,50};int*p;for(p=a;p

<a+5;p++){printf("%d\n",*p);}}数组的方法#include<stdio.h>voidmain(){inta[5]={10,20,30,40,50};inti;for(i=0;i<5;i++){printf("%d\n",i,a[i]);}}8.3

数组的指针和指向数组的指针变量指向数组的指针变量(px和py)进行算术运算和关系运算的含义说明:(1)可以进行的算术运算,只有以下几种:px±n,px++/++px,px--/--px,px-pypx±n:将指针从当前位置向前(+n)或回退(-n)n个数据单位,而不是n个字节。

显然,px++/++px和px--/--px是px±n的特例(n=1)。px-py:两指针之间的数据个数,而不是指针的地址之差。(2)关系运算表示两个指针所指地址之间、位置的前后关系:前者为小,后者为大。8

.3数组的指针和指向数组的指针变量指向数组的指针作函数参数数组名作形参时,接收实参数组的起始地址;作实参时,将数组的起始地址传递给形参数组。引入指向数组的指针变量后,数组及指向数组的指针变量作函数参数时,可有4种等价形式(本质上是一种,即指针数据作函数参数):(1)形参、实参都用

数组名(2)形参、实参都用指针变量(3)形参用指针变量、实参用数组名(4)形参用数组名、实参用指针变量8.3数组的指针和指向数组的指针变量例8.8已知某个学生的5门成绩,求平均成绩。要求用子函数求解程序运行结果:Input5scores:8085789

686↙Averagescoresis85.000000.8.3数组的指针和指向数组的指针变量二维数组的指针及其指针变量用具体数据类型的指针指向二维数组或多维数组的所表示意思的其实和一维数组一样,只不过多了地址计算。下边以二维数组为

例说明一下:二维数组定义语句:intarray[3][4];8.3数组的指针和指向数组的指针变量(1)从数组角度看,数组名array代表数组的起始地址,是一个以行(每行4个元素)为单位进行控制的行指针:array+i:行指针值,指向二维数组array[3][4]的第i行的起

始地址array[i][0]。*(array+i):(列)指针值,指向第i行第0列(控制由行转为列,但仍为地址)。*(*(array+i)):数组元素array[i][0]的值。用array作指针访问数组元素array[i][j]的格式:*(*(a

rray+i)+j)行指针是一个2级指针8.3数组的指针和指向数组的指针变量(2)从1维数组角度看,数组名array和第1维下标的每一个值,共同构成一组新的1维数组名array[0]、array[1]、array[2],它们均由4个整型元素

组成。在C语言中数组名代表数组的首地址,所以array[i]是第i行1维数组的地址,它指向该行的第0列元素,是一个以数组元素为单位进行控制的列指针:array[i]+j:(列)指针值,指向数组元素array[i][j]。*(array[i]+j):数组元素array[i][j]

的值。如果有“intarray[3][4],*p=array[0];”,则p+1指向下一个元素用p作指针访问数组元素array[i][j]的格式:*(p+(i*每行列数+j))8.3数组的指针和指向数组

的指针变量行指针变量就是指向由n个元素组成的一维数组的指针变量(1)定义格式数据类型(*指针变量)[n];由于C语言中,下标运算符“[]”的优先级高于指针运算符“*”所以“(*指针变量)”外的括号不能少,否则成了指针数组(由指针元素构成的数组,本章后边有介绍)。(2)

赋值行指针变量=二维数组名|行指针变量;8.3数组的指针和指向数组的指针变量*动态数组的实现C语言库函数alloc.h中有很多函数来解决动态内存的分配问题。就是可以在程序运行时动态的分配内存空间,不是象原来的一样只能在程序开始时申请。申请空间必须要有地址,所以指针和动态内存分

配是不可分的。•malloc()函数•free()函数•calloc()和recalloc()8.4字符串的指针和指向字符串的指针变量字符串是计算机与使用者进行交流的主要信号。与计算机的交流几乎都是字符串。字符串在C语言

中是以字符数组的形势存在的,最后一个字符是‘\0’。字符串在内存中的起始地址称为字符串的指针,也可以定义一个字符指针变量指向一个字符串。8.4字符串的指针和指向字符串的指针变量8.4.1字符串的表示与引用在C语言中,既可以

用字符数组表示字符串,也可用字符指针变量来表示;引用时,既可以逐个字符引用,也可以整体引用。虽然用字符数组和字符指针变量都能实现对字符串的存储和处理,但二者的存储和处理的方式有很大的不同,要注意区别。8.4字符串的指针和指向字符串的指针变量字符串指针作函数参

数例8.12用函数调用方式,实现字符串的复制。程序运行结果:Iamastudent.8.4字符串的指针和指向字符串的指针变量子程序中的for(i=0;(*(destination+i)=*(source+i))!=

’\0’;i++);语句的执行过程为:首先将源串中的当前字符,复制到目标串中;然后判断该字符(即赋值表达式的值)是否是结束标志‘\0’。如果不是,则相对位置变量i的值自增1,然后复制下一个字符;如果是结束标志‘\0’,则结束循环。其特点是:先复制、后判断,循环

结束前,结束标志‘\0’已经复制。8.5返回指针值的函数一个函数可以返回一个整型(int)、浮点型(float)、字符型(char)等数据,也可以返回一个指针类型的数据,即地址。其概念与以前类似,只是带回的值是指针类型。返回指针值的函数(简称指针函数)的定义格式如下:

指针数据类型*函数名([形参表])例8.13找出3个人在三个科目的考试中其中至少有一项成绩不合格的。输出编号和3课的成绩,要求使用指针函数实现。程序运行结果:No.1gradelist:637557No.3gradelist:5286758.5返回指针值的函数8.6指针数

组与主函数main的形参指针数组就是数组的每个元素都是一个指针(地址)。指针数组比较适合用于指向多个字符串,使字符串处理更加方便、灵活。指针数组的定义格式:数据类型*数组名[元素个数]注意与行指针变量定义格式“<数据类型>(*行指针变量)[<元素个数>]”的差别。例如char*na

me[5]={"zhangsan","lisi","wangwu","zhaoliu","liuqi"};则*name[0]的值就是”zhangsan”8.6指针数组与主函数main的形参例8.14对5个字符串按字母顺序从小到大排序输出程序运行

结果:lisiliuqiwangwuzhangsanzhaoliu8.6指针数组与主函数main的形参主函数main的形参在以往的程序中,主函数main都使用其无参形式。实际上,主函数main也是可以指定形参的。它的参数就类似于“dir/p/w”中的

“/p/w”,大家都知道,编写的c语言通过编译最后生成一个“*.exe”的可执行文件,在命令行里打入文件名一样可以执行,所以后边也可以添加参数。8.6指针数组与主函数main的形参1.主函数main的有参形式v

oidmain(intargc,char*argv[]){……}2.实参的来源运行带形参的主函数,必须在操作系统状态下,输入主函数所在的可执行文件名,以及所需的实参,然后回车即可。命令行的一般格式为:[实参2

……]8.6指针数组与主函数main的形参3.形参说明(1)形参argc是命令行中参数的个数(可执行文件名本身也算一个)。在本例中,形参argc的值为3(lock、+|-、文件名)。(2)形参argv是一个字符指针数组,即形参argv首先是一个数组(元素个数为形参argc的值),

其元素值都是指向实参字符串的指针。8.6指针数组与主函数main的形参指向指针的指针变量指向指针的指针变量是一个两级的指针变量。1.指向指针的指针变量的定义数据类型**指针变量[,**指针变量2……];就是用两个”*”,要是三

级用三个”*”2.指向指针的指针变量的赋值指针变量=指针数组名+i8.6指针数组与主函数main的形参例8.16指向指针的指针变量voidmain(){inta=123,*p1,**p2,***p3;p1=&a;p2=&p1;p3=&p2;printf(“a:%d,p1:%d,p2:%d

,p3:%d”,a,*p1,**p2,***p3);**p2=888;printf(“\na:%d,p1:%d,p2:%d,p3:%d”,a,*p1,**p2,***p3);}p3FF06FF08p3FF02FF04p3FF00FF02a123FF008.7函数

的指针和指向函数的指针函数也是存储在内存中的,一个函数在编译时,会被分配一个入口地址,这个入口地址就称为该函数的指针。通过该指针可以调用该函数。一般可以用一个指向函数的指针变量指向一个这个函数,然后通过该指针变量调用此函数。指向函数的指针变量用的也很多,一般

是用同一类型的几个函数在调用时根据数据的性质调用其中的一个。当调用很多次时不用改变了,只要改变指针就行了。8.7函数的指针和指向函数的指针调用格式(*函数指针变量)([实参表])指向函数的指针变量的常用用途之一,就是将函数指针作参数,传递到其它函

数。函数名作实参时,因为要缺省括号和参数,造成编译器无法判断它是一个变量还是一个函数,所以必须加以说明。函数说明的格式。

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?