c语言第11章-指针课件.ppt

c语言第11章-指针课件.ppt

ID:57057142

大小:263.00 KB

页数:37页

时间:2020-07-30

上传者:U-5649
c语言第11章-指针课件.ppt_第1页
c语言第11章-指针课件.ppt_第2页
c语言第11章-指针课件.ppt_第3页
c语言第11章-指针课件.ppt_第4页
c语言第11章-指针课件.ppt_第5页
资源描述:

《c语言第11章-指针课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

第11章指针1 指针变量理解指针的第一步是在机器级上观察指针表示的内容。多数现代计算机将内存分割为字节(bytes),每个字节可以存储8位(bits)的信息:每个字节都有唯一的地址(address)。2 指针变量程序中的每个变量占有一个或多个字节内存。将第一个字节的地址称为变量的地址。在下图中,变量i的地址是2000:3 指针变量如果内存中有n个字节,我们可以将内存地址的取值范围想像成0到n–1之间的整数:4 指针变量可以用一种特殊的指针变量来存储内存地址。当采用指针变量p来存储变量i的地址时,我们通常说“p指向i”。采用图形方式可以表达为:5 声明指针变量当声明一个指针变量时,变量名前必须加星号:int*p;声明的指针变量p可以指向一个int型对象注意:我们采用术语“对象”而不是“变量”,是因为p可以指向不属于变量的内存区域。6 声明指针变量指针变量可以和其它变量一起出现在声明中inti,j,a[10],b[20],*p,*q;C语言要求每个指针变量只能指向一种特定类型(即:引用类型)的对象:int*p;/*pointsonlytointegers*/double*q;/*pointsonlytodoubles*/char*r;/*pointsonlytocharacters*/至于具体是何种引用类型则没有限制7 取地址运算符和间接寻址运算符C语言为指针变量提供了一对特殊的运算符为得到变量的地址,可以使用&(取地址)运算符为了访问指针所指向的对象,可以使用*(间接寻址)运算符8 取地址运算符声明指针变量只是为指针留出空间,但并未将其指向任何对象:int*p;/*pointsnowhereinparticular*/在使用p之前对其进行初始化是至关重要的。9 取地址运算符一种初始化指针变量的方法是采用某个变量的地址对其进行赋值:inti,*p;…p=&i;将变量i的地址赋给变量p,结果是令p指向i10 取地址运算符在声明指针变量的同时也可以对其初始化:inti;int*p=&i;甚至可以进一步将整型变量i的声明和指针变量p的声明合并到一条语句中:inti,*p=&i;11 间接寻址运算符一旦指针变量指向了某个对象,就可以使用*(间接寻址运算符)访问存储在对象中的内容如果p指向i,可以采用如下方式输出i的值:printf("%d ",*p);对变量使用&运算符产生指向变量的指针,而对指针使用*运算符则可以返回到原始变量:j=*&i;/*sameasj=i;*/12 间接寻址运算符只要p指向i,*p就是i的别名(alias)*p拥有和i相同的值改变*p的值,同时也会改变i的值下页中给出的示例描述了*p和i的等价关系13 间接寻址运算符p=&i;i=1;printf("%d ",i);/*prints1*/printf("%d ",*p);/*prints1*/*p=2;printf("%d ",i);/*prints2*/printf("%d ",*p);/*prints2*/14 间接寻址运算符将间接寻址运算符应用于未初始化的指针变量,会导致未定义的行为:int*p;printf("%d",*p);/***WRONG***/对*p进行赋值则更加危险:int*p;*p=1;/***WRONG***/15 指针赋值C语言允许使用赋值运算符对指向同种类型变量的指针进行复制。假设声明如下变量:inti,j,*p,*q;对指针进行赋值的示例如下:p=&i;16 指针赋值另一个指针赋值的例子为:q=p;赋值的结果是:指针q与p指向相同的位置:17 指针赋值如果p和q都指向变量i,可以使用对*p或*q赋值的方法来改变i的值:*p=1;*q=2;任意数量的指针变量都可以指向同一个对象18 指针赋值注意不要混淆概念:q=p;和*q=*p;第一条语句是一个指针赋值语句,第二条不是下页中的图示给出了第二条语句的实际效果19 指针赋值p=&i;q=&j;i=1;*q=*p;20 指针作为参数在9.3节,我们曾试图编写一个decompose函数,用于修改传入函数的实际参数,但失败了本节我们将演示:通过向decompose函数传递指针(而不是变量值),可以实现对实际参数的修改21 指针作为参数Decompose函数的新定义:voiddecompose(doublex,long*int_part,double*frac_part){*int_part=(long)x;*frac_part=x-*int_part;}Decompose函数可能的原型:voiddecompose(doublex,long*int_part,double*frac_part);voiddecompose(double,long*,double*);22 指针作为参数调用decompose函数的方法:decompose(3.14159,&i,&d);函数调用的结果是:int_part指向i,而frac_part指向d:23 指针作为参数Decompose函数体内的第一条赋值语句将x的值转化为长整型(long),并将其存储在指针变量int_part指向的对象中:24 指针作为参数第二条赋值语句将(x-*int_part)存储到指针变量frac_part所指向的对象:25 指针作为参数Scanf函数接受的实参必须是指针:inti;…scanf("%d",&i);注意:如果去掉&运算符,scanf函数实际接收到的参数是变量i的值。26 指针作为参数尽管scanf的参数必须是指针,但在使用中却不一定非要使用取地址运算符&:inti,*p;…p=&i;scanf("%d",p);在上例中使用&运算符会导致错误:scanf("%d",&p);/***WRONG***/27 指针作为参数对于以指针为参数的函数,如果参数传递时不小心传递了错误的值,可能导致灾难性的后果。例如在调用decompose时,省略变量前的&运算符:decompose(3.14159,i,d);当decompose向*int_part和*frac_part所表示的位置存入数值时,将会试图修改未知的内存位置(的内容),而不是如预期地修改i和d的值。如果在此之前声明了decompose的函数原型,编译器就能够检测出上述错误。然而在scanf的例子中,编译器通常无法检测出这种指针传递上的错误。28 程序:找出数组中的最大和最小元素程序max_min.c使用名为max_min的函数来找出数组中的最大和最小元素。max_min函数的原型:voidmax_min(inta[],intn,int*max,int*min);max_min函数调用示例:max_min(b,N,&big,&small);当max_min找到数组b中的最大元素时,采用给*max赋值的方式将其存储到big中。当max_min找到数组b中的最小元素时,采用给*min赋值的方式将其存储到small中。29 程序:找出数组中的最大和最小元素程序max_min.c将会首先从终端读入10个数到一个数组中,然后将该数组传递给max_min函数,最后现实出结果:Enter10numbers:34824910279423115031Largest:102Smallest:730 maxmin.c/*Findsthelargestandsmallestelementsinanarray*/#include#defineN10voidmax_min(inta[],intn,int*max,int*min);intmain(void){intb[N],i,big,small;printf("Enter%dnumbers:",N);for(i=0;i*max)*max=a[i];elseif(a[i]<*min)*min=a[i];}}32 用const保护参数当传递指向变量x的指针给一个函数f时,通常意味着x的值将被修改:f(&x);然而有的时候,f可能仅仅需要对x的值进行检查,而不需要对其进行修改。采用指针参数更高效的原因:如果变量占用大量内存空间,那么传递变量的值会造成时间和空间上的浪费。33 用const保护参数可以使用const关键字确保函数不会修改指针参数所指向的对象。Const应放置在形式参数的声明中,位于参数的类型说明之前:voidf(constint*p){*p=0;/***WRONG***/}如果函数中的语句试图修改*p的值,编译器能够捕获此类错误。34 指针作为返回值C语言允许函数返回指针int*max(int*a,int*b){if(*a>*b)returna;elsereturnb;}max函数的调用方式:int*p,i,j;…p=max(&i,&j);函数调用结束后,p指向i或j其中之一。35 指针作为返回值尽管上例中max函数返回的指针是作为实际参数传入的两个指针中的一个,但这不是唯一的选择函数也可以返回指向外部变量或指向声明为static的局部变量的指针。注意:不要返回指向自动局部变量的指针int*f(void){inti;…return&i;}一旦函数f返回,变量i将不复存在36 指针作为返回值指针可以指向数组元素设a为数组,则&a[i]为指向数组a中元素i的指针但函数的参数中有数组时,返回一个指向数组中的某个元素的指针,有时会有特殊用途假设数组a具有n个元素,下述函数返回一个指针,指向位于数组a中间的那个元素:int*find_middle(inta[],intn){return&a[n/2];}37

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭