欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    第10章指针2.ppt

    • 资源ID:2546962       资源大小:656.01KB        全文页数:109页
    • 资源格式: PPT        下载积分:10
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要10
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第10章指针2.ppt

    第十章,指针,主要内容,10.1地址和指针的概念 10.变量的指针和指向变量的 指针变量 10.数组与指针 10.字符串与指针 10.指向函数的指针 10.返回指针值的函数 10.指针数组和指向指针的指针 10.8有关指针的数据类型和指针运算的小结,10.1地址和指针的概念,内存区的每一个字节有一个编号,这就是“地址” 。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。,.按变量地址存取变量值的方式称为“直接访问”方式 (,); (,); ;,2. 另一种存取变量值的方式称为“间接访问”的方式。即,将变量的地址存放在另一个变量中。,在语言中,指针是一种特殊的变量,它是存放地址的。,一个变量的地址称为该变量的“指针”。 例如,地址2000是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。上述的i_pointer就是一个指针变量。,指针和指针变量的定义:,10.2 变量的指针和指向变量的指 针变量,10.1 定义一个指针变量,定义指针变量的一般形式为 基类型 *指针变量名;,下面都是合法的定义: float *pointer_; char *pointer_; 可以用赋值语句使一个指针变量得到另一个变 量的地址,从而使它指向一个该变量。 例如: pointer_; pointer_;,在定义指针变量时要注意两点:,10.2.2 指针变量的引用,注意:指针变量中只能存放地址(指针), 不要将一个整数(或任何其他非地址类型的数据) 赋给一个指针变量。,例10. 通过指针变量访问整型变量,#include void main ( ) int ,; int*pointer_, *pointer_; ; pointer_; /*把变量的地址赋给 pointer_1 */,pointer_; /*把变量的地址赋给 pointer_ */ printf(%,%,); printf(%,%,*pointer_, *pointer_); ,对“”和“*”运算符说明: 如果已执行了语句 pointer_; (1)* pointer_的含义是什么? “”和“*”两个运算符的优先级别相同,但按自右而左方向结合。因此,* pointer_与相同,即变量a的地址。 如果有pointer_2 * pointer_ ;它的作用是将(的地址)赋给pointer_2 ,如果pointer_2原来指向,经过重新赋值后它已不再指向了,而指向了。,(2) *的含义是什么? 先进行运算,得的地址,再进行*运算。*和*pointer_的作用是一样的,它们都等价于变量。即*与等价。,(3) (*pointer_)相当于。,例10 . 2 输入和两个整数,按先大后小的顺序输出 和。,#include void main() int *1,*2,*,; scanf(,); 1; if() ; printf(=,=,); printf(max=,min=,*1,*2); ,运行情况如下: , , , 当输入,时,由于,将和交换。交换前的情况见图(),交换后见图()。,10.3 指针变量作为函数参数,例10 . 3 对输入的两个整数按大小顺序输出,#include void main() void swap(int *,int *); int ,; int *pointer_,*pointer_; scanf(,); pointer_ ; pointer_2 ; if( swap( pointer_ , pointer_2 ); printf(,); ,void swap(int *,int *) int temp; temp*1; *; *temp; ,例10. 输入、 3个整数,按大小顺序输出。,#include void main() void exchange(int *1, int *2, int *3); int ,*,*,*; scanf(%,%,%,&, &, &); ; exchange (,); printf(,); ,void exchange(int *, int *, int *) void swap(int *, int *); if(*) swap(,); if(*) swap(,); if(* swap(,); void swap(int *, int *) int temp; temp*; *; *temp; ,10.3 数组与指针,一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元素的地址。,定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。 例如: ; (定义为包含个整型数据的数组) *; (定义为指向整型变量的指针变量) 应当注意,如果数组为型,则指针变量的基类型亦应为型。,10.3.1 指向数组元素的指针,对该指针变量赋值: ; 把元素的地址赋给指针变量。也就是使指向数组的第号元素,如图:,10.通过指针引用数组元素,引用一个数组元素,可以用: () 下标法,如形式; () 指针法,如*()或*()。其中是数组名,是指向数组元素的指针变量,其初值。,例10.5 输出数组中的全部元素。,假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:,(1)下标法。 #include void main() int ; int ; for(;) scanf(,); printf(); for(;) printf(,); ,(2) 通过数组名计算数组元素地址,找出元素的值。 #include void main() int ; int ; for(; ) scanf(,); printf(); for(;) printf(,*(); ,(3) 用指针变量指向数组元素。 #include void main() int ; int *,; for(;) scanf(,); printf(); for(;();) printf( ,*); ,例10. 通过指针变量输出数组的个元素。,#include void main() int*,; ; for(; ) scanf(,); printf(); for(;, ) printf(,*); ,程序运行情况: 1 2 3 4 5 6 7 8 9 0 22153 234 0 0 30036 25202 11631 8259 8237 28483 显然输出的数值并不是数组中各元素的值,#include void main() int*,; ; for(;) scanf(,); printg(); p=a; for(;, ) printf(,*); ,10.3 用数组名作函数参数,在第8章8.7节中介绍过可以用数组名作函数的参数 如: void main() i(int arr,int ); int array; (array,); void (int arr ,int ) ,例10 将数组中个整数按相反顺序存放。,#include void main() void inv(int ,int ); int , ,; printf(The original array:); for(;) printf (,); printf(); inv (,); printf(The array has been in verted:); for(;) printf (,); printf (); ,void inv(int ,int ) /*形参x是数组名*/ int temp,(); for(;) ; temp; ; temp; return; ,运行情况如下: The original array: , The array has been inverted: ,,#include void main() void inv(int *,int ); int , ,; printf( The original array: ); for(;) printf (,); printf (); inv(,); printf ( The array has been in verted: ); for(;) printf (,); printf ();,对刚才的程序可以作一些改动。将函数inv中的形参改成指针变量。,void inv(int *,int ) /*形参x为指针变量*/ int,temp,*,*,(); ; for(;,) emp*;*;*temp; return; ,如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下种情况:,(1) 形参和实参都用数组名,如: void main() void (int ,int ) int ; (,); ,(2) 实参用数组名,形参用指针变量。如: void () void (int *,int ) int ; (,); ,(3)实参形参都用指针变量。例如: void main() void (int *,int ) int , *p=a; (p,); ,(4) 实参为指针变量,形参为数组名。如: void main() void (int x ,int ) ,*p=a; (p,); ,#include void main() void inv(int *,int ); int ,*; printf(The original array:n ); for(;,) scanf(,); printf(); ; inv(,); /* 实参为指针变量 */ printf(The array has been inverted :); for(; ) printf(,*); printf(); ,void inv(int *,int ) int,temp,*,*; (); ; for(;,) emp*;*;*temp; return; ,例109 用选择法对个整数按由大到小顺序排序。,#include void main() void sort(int ,int ); int*,10; ; for(;) scanf(,); ; sort(,); for(,;) (,*); ,void sort(int ,int ) int ,; for(;) ; for(;) () ; (!) ; ; ; ,10.3.4 多维数组与指针,用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。,1. 多维数组元素的地址,先回顾一下多维数组的性质,可以认为二维数组是“数组的数组”,例 : 定义int a34=1,3,5,7,; 则二维数组a是由3个一维数组所组成的。设二维数组的首行的首地址为 ,则,例10.0 输出二维数组有关的值,#include define FROMAT , void main() int 341,3,5,7,9, ,; printf(,*); printf(,0 , *(); printf(,0,00); printf(,1,); printf(,10,*(+)+); printf(,*(); printf(,); printf(,*(*( ); ,某一次运行结果如下: , (0行首地址和0行0列元素地址) , (0行0列元素地址) , (0行0首地址和0行0列元素地址) , (1行0列元素地址和1行首地址) , (1行0列元素地址) , (2行0列元素地址) , (2行首地址) , (1行0列元素的值),2 . 指向多维数组元素的指针变量,(1) 指向数组元素的指针变量,例10.11 用指针变量输出二维数组元素的值,#include void main() int 341,3,5,7,9,11,13,15,17,19,21,23; int*; for(;) () printf(); printf(,*); ,运行结果如下: 1 3 5 7 9 11 13 15 19 21 23,(2) 指向由个元素组成的一维数组的指针变量,例10.13 出二维数组任一行任一列元素的值,#include void main ( ) int 1,3,5,7,9,11, 13,15,; int (*),; ; scanf( ,); printf(, ,*(*(); ,运行情况如下: ,(本行为键盘输入) ,,3. 用指向数组的指针作函数参数,例10.13 有一个班,个学生,各学门课,计算总平均分数以及第个学生的成绩。这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。用函数average求总平均成绩,用函数search找出并输出第个学生的成绩。,#include void main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,70,60,80, 87,90,81,90,99,100,98; average(*score,12);*求12个分数的平均分* search(score,);*求序号为的学生的成绩* ,void average(float *,int ) float*_; float sum,aver; p_end; for(;_;) sumsum(*); aversum; printf(average,aver); ,void search(float (*)4,int ) / * p是指向具有4个元素的一维数组的指针 */int ; printf(the score of No. % are:,); for(;) printf(5.2,*(*(); ,程序运行结果如下: average The score of No.2 are: . . . .,例10.4 在上题基础上,查找有一门以上课程不及格的学生,打印出他们的全部课程的成绩。,#include void main() void search(float (*p)4,int n);/*函数声明*/ float score34=65,57,70,60,58,87, 90,81,90,99,100,98; search(score,); ,void search(float (*p)4,int ) int ,; for(;) flag; for(;) if(*(*()) flag; if() printf(“No.%d fails,his scores are:n“,j+1); for(;) printf(%.,*(*(); printf(); ,程序运行结果如下: No.1 fails, his scores are: . . . . No.2 fails, his scores are: . . . .,10. 字符串与指针,10.4.字符串的表示形式,例 10.5 定义一个字符数组,对它初始化, 然后输出该字符串,#include void main() char stringI love China!; printf(,string); ,(1) 用字符数组存放一个字符串,然后输出该字符串。,(2) 用字符指针指向一个字符串。 可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。,例106 定义字符指针 #include void main() charstring I love China!; printf(,); ,例10.7 将字符串复制为字符串。,#include void () char am a boy,20; int ; for(;*()!;) *()*(); *(); printf(string a is :,); printf(string b is:); for(;!;) printf(,); printf(); ,也可以设指针变量,用它的值的改变来指向字符串中的不同的字符。,例10.8 用指针变量来处理例107问题。,#include void main() char =I am a boy. ,20,*p1,*p2; int ; ; for(;*!;p1,p2),*; *; printf(string is:,); printf( :); for(;!;) printf(,); printf(); ,程序必须保证使和同步移动,10.4.2 字符指针作函数参数,例10.19 用函数调用实现字符串的复制,#include void main() void copy_string(char from , char to ); char a = am a teacher; char =you are a student; printf(“string a= string , ,); printf(“copy string a to string b:n ”); copy_string (,); printf(“nstring a=%snstring b=%sn“,a,b); ,(1) 用字符数组作参数,void copy_string(char from , char to ) int ; while(from!) tofrom; to; ,程序运行结果如下: string aI am a teacher string b you are a student copy string a to string b: string a I am a teacher stringI am a teacher,(2) 形参用字符指针变量,#include void main() void copy_string(char * from, char *); char * am a teacher .; char *you are a student ; printf(“string a=string ,); printf(“copy string a to string b:n “); _(,); printf(“nstring a=%snstring b=%sn“,a,b); ,void copy_string(char *,char *) for(;*from!;from,to) *tofrom; *to; ,(3) 对copy string 函数还可作简化,1、将copy_string函数改写为 void copy_string (char *from,char *) while(*from)!) to;from; , copy_string函数的函数体还可改为 while(*to*from)!); ,copy_string函数的函数体还可写成 while(*from!) *to*from; *to; ,上面的while语句还可以进一步简化为下面的while语句: while(*to*from); 它与下面语句等价: while(*to*from)!); 将*from赋给*to,如果赋值后的*to值等于则循环终止(已赋给*to),函数体中while语句也可以改用for语句: for(;(*to*from)!;); 或 for(;*to*from;);,也可用指针变量,函数copy_string可写为 void copy_string (char from ,char ) char*,*; from; while(*p2*p1)!); ,(1) 字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。 (2)赋值方式。对字符数组只能对各个元素赋值,不 能用以下办法对字符数组赋值。 char str; strI love China!; 而对字符指针变量,可以采用下面方法赋值: char*; I love China!;,10.4.3 对使用字符指针变量和字符数组的讨论,字符数组和字符指针变量二者之间的区别:,(3)对字符指针变量赋初值: char * love China!;等价于 char*; I love Chian!; 而对数组的初始化: char str love China!; 不能等价于 char str; str I love China!;,(4) 定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址。,例如: char str; scanf(,str);,(5) 指针变量的值是可以改变的,例如:,例10.0 改变指针变量的值,#include void () char*I love China!; ; printf(,); ,#include void main() char* love hina!; int ; printf ( “ The sixth character is %cn“,a5); for(;!;) printf(,); ,若定义了一个指针变量,并使它指向一个字符串,就可以用下标形式引用指针变量所指的字符串中的字符。例如:,10. 指向函数的指针,10.5.1 用函数指针变量调用函数,用指针变量可以指向一个函数。 函数在编译时被分配给一个入口地址。这个函数的入口地址就称为函数的指针。,#include void main() int max(int,int); int ,; scanf(,); (,); printf(, ,); int max(int ,int ) int ; if(); else ; return(); ,将 main 函数改写为 #include void main() int (int,int); int (*)(); int ,; ; scanf(,); (*)(,); printf(, ,); ,10.5.2 用指向函数的指针作函数参数,函数指针变量常用的用途之一是把指针作为参数传递到其他函数。指向函数的指针也可以作为参数,以实现函数地址的传递,这样就能够在被调用的函数中使用实参函数。,实参函数名 f1 void (int (*x1)(int),int (*x2)(int,int)) int ,; (*)(); *调用函数* (*)(,);*调用函数* ,例10.3 设一个函数process,在调用它的时候,每次实现不同的功能。输入和两个数,第一次调用process时找出和中大者,第二次找出其中小者,第三次求与之和。,#include void main() int max(int,int); /* 函数声明 */ int min(int,int); /* 函数声明 */ int add(int,int); /* 函数声明 */ void process (int , int , int(*fun)(); /* 函数声明 */ int ,; printf(enter a and b:); scanf(,);,printf(max); process(,); printf(min); process(,); printf(sum); process(,); ,int max(int ,int ) /* 函数定义 */ int ; if(); else ; return(); int min(int ,int ) /* 函数定义 */ int ; if(); else ; return(); ,int (int ,int ) /* 函数定义 */ int; ; return(); void process(int ,int ,int (*fun)(int,int) int result; result(*fun)(,); printf(, result); ,10. 返回指针值的函数,一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。 这种带回指针值的函数,一般定义形式为 类型名 *函数名(参数表列); 例如: int *(int ,int );,例104 有若干个学生的成绩(每个学生有门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。,#include void main() float *score 4=60,70,80,90, 56,89,67,88,34,78,90,66; float*search(float (*pointer)4,int n); float*; int ,; printf(enter the number of student:); scanf(,); printf(The scores of No are:,);,search(,); for(; printf(,*(); float * search(float (*)4,int ) float *; *(); return(); ,运行情况如下: enter the number of student: The scores of No. are: 56.00 89.00 67.00 88.00,例10.5 对上例中的学生,找出其中有不及格课程的学生及其学生号。,#include void main() float score 4=60,70,80,90,56, 89,67,88,34,78,90,66; float search(float (*pointer)4); float*; i ,;,for(;) search(score ); (*(score) printf( scores:,); for(;) printf(5.2,*(); printf(); ,10.7 指针数组和指向指针的指针,10.7.1 指针数组的概念,一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。 一维指针数组的定义形式为: 类型名数组名数组长度; 例如: *;,例10.6 将若干字符串按字母顺序(由小到大)输出。,#include #include void main() void sort(char *name ,int n); void printf(char *name ,int n); char *name =“Follow me“,“BASIC“,“Great Wall,“FORTRAN“,“Computer design“; int ; sort(,); print(,); ,void sort(char * ,int ) char *; int ,; for(; ; for(; if(strcmp(name,name)0)=; if(!) temp=namei; namei

    注意事项

    本文(第10章指针2.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开