C语言第七次课

上传人:gb****c 文档编号:243009950 上传时间:2024-09-13 格式:PPT 页数:31 大小:180KB
返回 下载 相关 举报
C语言第七次课_第1页
第1页 / 共31页
C语言第七次课_第2页
第2页 / 共31页
C语言第七次课_第3页
第3页 / 共31页
点击查看更多>>
资源描述
,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,Company Logo,C-LANGUAGE,第八章,指 针,指针的概念,指针可以理解为地址,一个变量在内存单元的首地址称为该,变量的“指针”,,通过变量指针可以找到该变量所占用的内存,单元。,指针变量,即专门用来存放内存地址的变量,。也就是说,如,果有一个变量专门用来存放另一变量的地址,(,即指针,),,则它,称为“指针变量”。,指针是一个地址,而指针变量是存放地址,的变量。, 指针变量的定义形式为:,类型名 *指针变量名;,e.g. int *p,*q,;,说明:, 指针变量的类型名用来指定该指针变量可以指向的变,量的类型。,2,指针的概念, 在定义指针变量时必须指定类型名。,一个指针变量只能指,向同一类型的变量,,不能忽而指向一个整型变量,忽而指,向一个实型变量。, 指针变量前面的“*”表示该变量的类型为指针型变量。,在定义指针变量时必须指定类型名,,如果指针是指向一个,整型变量,那么“使指针移动,1,个位置”意味着移动,4,个字,节,“使指针加,1”,意味着使地址值加,4,个字节。, 指针变量的引用,说明:,C,语言中对指针变量的引用是通过“,&”,和“*” 两个运算,符实现的。其中,,&,是取地址符,。,它的一般格式为:,&,变量名,*是取值运算符,,又称间接访问运算符。,它的格式为:*指针变量名,3,指针的概念,例题:,main(), int x,y;,int *p;,x=10;,p=,y=*p;,printf(“y=%dn”,y);,note:”*”,运算符在该例中两次出现,分别代表两种不同的含,义。在定义变量时,“*”只起标记作用,用来说明所定,义的变量是指针变量。在非定义状态下,“*”是间接访,问运算符,用来获取指针变量所指向变量的内容。,表示,p,是指向整型变量的指针变量,表示通过取地址符,&,将变量,x,的地址赋给指针变量,p,表示把,p,所指向的变量的值赋给,y,4,指针的概念, 指针变量的初始化,指针变量在使用之前必须对其进行初始化,使指针变量指向一,个确定的内存单元。,一般形式为:,类型说明符 *指针变量名,=,初始地址值;,e.g. int a=10,;,int *p=&a,;,note,:, 任何指针变量在使用之前,都要进行定义并赋值,,未,经赋值的指针变量是禁止使用的。, 在初始化指针时,要注意类型匹配的问题,也就是,说,必须是同一类型数据的地址才能进行指针初始化。, 可以把一个指针的值赋给另一个指针,但,不能,直接,用整型数据赋值给指针变量。,5,指针的概念, 指针的运算,在,C,语言程序中,指针只能进行赋值运算,部分算术运算及关,系运算。, 赋值运算,说明:指针变量的赋值运算只能在同一数据类型之间进行。,e.g. int *p1,*p2,a,s5;,int *p1= /*,指针变量初始化赋值*,/,p2= /*,把变量,a,的地址赋给指针变量,p2*/,p1=s; /*,把数组,s,的首地址赋给指针变量,p1*/,p1= /*,把数组元素,s3,的地址赋给指针变量,p1*/,P1=Null; /*,把空指针,Null,赋给指针变量,p1*/,6,指针的概念,说明:,Null,是一个符号常量,在,stdio.h,头文件中有对它的定,义。将指针变量赋值为,Null,,表示该指针变量当前未指,向任何变量,其值为,0.,note,:给指针变量赋,0,值和不赋值是不同的。,指针变量未赋值时,程序编译时分配给指针变量的存储空间中,的值是不确定的,可以是任何值,直接使用该指针变量有可能,造成错误。而指针变量被赋,Null,值后,值是确定的,则可以,使用,只是它未指向具体的变量。, 算术运算,描述:主要是对指针变量加上或减去一个整数,这样会使指针,变量指向相邻的存储单元,即指针的移动。只有指针变,量指向一片连续的存储单元时,指针的移动才有意义。,7,指针的概念,e.g.,在内存中有一片地址连续的存储单元,基本类型为,int,类型的指针变量,p,指向地址为,1000,的存储单元,若执行操作,p=p+1,;则指针变量,p,指向,首地址为,1004,的存储单元。,note:,指针变量,p,的基本类型为,int,,移动一个存储单元的长度就是移动,4,个字,节。因此,对指针变量进行加减运算时,数字“,1”,不再代表十进制整,数”,1“,,而是指一个存储单元长度。, 关系运算,描述:其实就是比较地址值的大小。,设,p,、,q,是指向同一数据集合的指针变量,若,pq,的值为真,则表明,p,指针变量,所指向的元素在,q,指针变量所指向的元素之后。,像,p=q,pb) s);,printf(“n%d,%dn”,a,b);,17,指针与数组, 若将上述函数改成,void s x,int y), int temp;,temp=x;,x=y;,y=temp;,main,函数中改为,s);,若将上述函数改成,void s *p1,int *p2), int *p;,p=p1;,p1=p2;,p2=p,18,指针与数组, 指针与二维数组,二维数组的首地址和数组元素的地址,e.g. int a23;,任何一个二维数组都由若干个一维数组组成。,C,语言允许把一个二维数组分解为多个一维数组来处理。因此数组,a,可以理解为由两个一维数组组成,即数组,a,由,a0,、,a1,两个元素组成,,a,是二维数组名,而每个元素又各自含有,3,个元素。,a0,、,a1,既然是一维数组名,而,C,语言规定数组名代表数组的首地址,则,a0,代表数组元素,a00,的地址,即,&a00.a1,的值为,&a10,。, 二维数组名是一个地址常量,note,:, 对于二维数组名,a,,也不可以进行,a+,、,a=a+i,;之类赋值运算。, 在二维数组中,,a,的值与,a0,的值相同,但是基本类型不同,。,a,等价于一个二维指针,而,a0,是一个一维指针,因此,以下赋,值是不正确的。,int a34=0,*p; p=a;,19,指针与数组,a,指针的基类型是拥有,3,个元素的一维数组,地址,a+1,表示的是,a1,的地址,,a+2,表示的是,a2,的地址,所以,a+i,与,&ai,等价,*,(a+i),与,ai,等价。, 二维数组元素及地址, 取数组元素,aij,的地址的,5,种方法,&aij,ai+j,*,(a+i)+j,&a00+x*i+j,a0+x*i+j,20,指针与数组, 数组,a,的性质,表示形式,含义,a,数组名,,0,行首地址,a0,*(a+0),*a,0,行,0,列元素地址,a+1,&a1,1,行首地址,a1,*(a+1),1,行,0,列,,a10,的地址,a1+2,*(a+1)+2,&a12,a12,的地址,*,(a1+2),*(*(a+1)+2),a12,a12,的值,21,指针与数组,说明:,),在指向行的指针前面加一个“*”,就转换为指向,列的指针。反之,在指向列的指针前面加“,&”,,,就成为指向行的指针。,),*,(a+i),只是,ai,的另一种表示形式,不要简单,的认为*,(a+i),是,a+i,所指单元中的内容,在一,维数组中,a+i,所指的是一个数字元素的存储单元。,在该单元中有具体的值,而对二维数组,,a+i,不是,指向具体存储单元而指向行。,练习:设有定义,double a10,*s=a;,以下能够代表数组,元素,a3,的是,(),A) (*s)3 B) *(s+3) C) *s3 D) *s+3;,答案:,B,22,指针与数组, 定义指针数组,指针数组一般定义形式为:,类型名 *指针数组名,常量表达式,;,e.g. int *p3,;,解释:定义了一个具有,3,个元素的一维数组,每个元素都只能,存放指针,这些指针的基本类型都必须为整型,故称,p,为指针数组。,说明:,的优先级高于*,因此,p,先与,结合,构成,p3,说明,p,是个数组名,在它前面的*号,说明数组,p,中的每个元素只能存放指针。,p0,p1,p2,23,指针与数组,可以通过指针数组,p,来引用,a,数组元素,等价如下,) *(pi+j),与*,(ai+j),对应,) *(*(p+i)+j),与*,(*(a+i)+j),对应,) (*(p+i)j,与*,(*(a+i)j,对应,) pij,与,aij,对应,例题:,int a32=1,2,3,4,5,6,*p3;,p0=a1;,分析程序。,24,指针与数组, 定义行指针,行指针的一般定义形式:,类型名,(*,指针数组名,),常量表达式,;,e.g. int (*P)2;,解释:定义了一个指针变量,p,,,p,只能存放含有两个整型元素的一维数组,的首地址。,note,:,p,并不是一个含有两个元素的一维数组。,说明:,(),的优先级高于,,因此,p,先与*结合,说明,p,是一个指针变量,,在它后面的,2,则说明指针,p,的基类型为,2,个整型元素,所以,p+1,不是让指针,p,移动一个整型大小,而是移动两个整型大小。,指针数组与行指针的区别,a20,a21,a00,a01,a10,a11,p+0,p+1,p+2,int (*p)2,a32;,p=a;,25,指针与字符串,e.g. char *p=“China”;,或,char *p,;,p=“China”,;,解释:把字符串“,China”,赋值给字符指针,p,,即把保存字符串“,China”,的内存的首地址赋给了指针,p,。使得指针,p,指向了字符串“,China”,,这样就可以通过指针,p,来处理字符串“,China”,。,char str1O; str=“China”,;, 访问一个字符串的两种方法,e.g. char *string=“I love China,!”;,等价于,char *string,;,string=“I love China,!”;,这是错误的赋值,用字符数组存放一个字符串,然后输出,用字符指针指向一个字符串,26,指针与字符串,练习:有以下程序,#include,void fun(char *t,char *s),while(*t!=0)t+;,while(*t+=*s+)!=0);,main(), char ss10=“acc”,aa10=“bbxxyy”;,fun(ss,aa);printf(“%s,%sn”,ss,aa);,程序的运行结果是(),A) accxyy,bbxxyy B) acc,bbxxyy,C) accxxyy,bbxxyy D) accbbxxyy,bbxxyy,答案:,D,27,指向指针的指针,通常把用来保存指针变量地址的变量叫做二级指针,或,者称为指向指针的指针。,例题:,#include,main(), int a=10,*pa,*ppa;,pa=,/*pa,指向变量,a*/,ppa=,/*ppa,指向指针变量,a*/,printf(“a=%d,*pa=%d, *pa=%dn”,a,*pa,*pa);,28,指针与函数,C,语言中,一个函数也是占用一段连续的内存空间,而函数名,和数组名一样也表示该函数所占内存区的首地址,(,或者叫函数,的入口,),。所以函数名也是一个地址常量。,可以把函数的首地址赋予一个指针变量,使该指针变量指向该函数。,通常把这种指向函数的指针变量称为函数指针变量。,函数指针变量定义的一般格式为:,类型说明符,(*,指针名,)();,说明:,“,类型说明符”表示函数的返回值类型。“,(*,指针名,)”,表示“*”后面的变量定义的指针变量,一般在使用前,已加以定义。,例题见书,29,数据类型小结,定义,含义,int i;,定义整型变量,i,int *p;,p,指向整型数组的指针变量,int an;,整型数组,a,int *pn;,指针数组,p,,由,n,个指向整型数据的指针组成,int (*p)n;,p,指向含,n,个元素的一维数组的指针变量,int f;,f,返回整型函数值的函数,int *p();,p,返回一个指针的函数,该指针指向整数,int (*p)();,p,为指向函数的指针,int *p;,p,为一指针变量,指向一个指向整数数据的指针。,30,Thank you,记得完成作业哦!,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!