收藏 分享(赏)

第10章_指针2.ppt

上传人:hskm5268 文档编号:8832927 上传时间:2019-07-14 格式:PPT 页数:109 大小:533KB
下载 相关 举报
第10章_指针2.ppt_第1页
第1页 / 共109页
第10章_指针2.ppt_第2页
第2页 / 共109页
第10章_指针2.ppt_第3页
第3页 / 共109页
第10章_指针2.ppt_第4页
第4页 / 共109页
第10章_指针2.ppt_第5页
第5页 / 共109页
点击查看更多>>
资源描述

1、第十章,指针,主要内容,10.1地址和指针的概念10.变量的指针和指向变量的 指针变量10.数组与指针 10.字符串与指针10.指向函数的指针10.返回指针值的函数10.指针数组和指向指针的指针10.8有关指针的数据类型和指针运算的小结,10.1地址和指针的概念,内存区的每一个字节有一个编号,这就是“地址” 。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内存单元。,.按变量地址存取变量值的方式称为“直接访问”方式(,);(,);,2. 另一种存取变量值的方式称为“间接访问”的方式。即,将变量的地址存放在另一个变量中。,在语言中,指针是一种特殊的变量,它是存放地址的。,

2、一个变量的地址称为该变量的“指针”。 例如,地址2000是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。上述的i_pointer就是一个指针变量。,指针和指针变量的定义:,10.2 变量的指针和指向变量的指 针变量,10.1 定义一个指针变量,定义指针变量的一般形式为 基类型 *指针变量名;,下面都是合法的定义: float *pointer_; char *pointer_; 可以用赋值语句使一个指针变量得到另一个变 量的地址,从而使它指向一个该变量。 例如: pointer_; pointer_;,在定义指针变量时要注意两点:,10.2.2 指针变量

3、的引用,注意:指针变量中只能存放地址(指针), 不要将一个整数(或任何其他非地址类型的数据) 赋给一个指针变量。,例10. 通过指针变量访问整型变量,#include void main ( ) int ,;int*pointer_, *pointer_;pointer_; /*把变量的地址赋给 pointer_1 */,pointer_; /*把变量的地址赋给pointer_ */printf(%,%,);printf(%,%,*pointer_, *pointer_ ); ,对“”和“*”运算符说明: 如果已执行了语句 pointer_; (1)* pointer_的含义是什么?“”和“*

4、”两个运算符的优先级别相同,但按自右而左方向结合。因此,* pointer_与相同,即变量a的地址。如果有pointer_2 * pointer_ ;它的作用是将(的地址)赋给pointer_2 ,如果pointer_2原来指向,经过重新赋值后它已不再指向了,而指向了。,(2) *的含义是什么?先进行运算,得的地址,再进行*运算。*和*pointer_的作用是一样的,它们都等价于变量。即*与等价。,(3) (*pointer_)相当于。,例10 . 2 输入和两个整数,按先大后小的顺序输出和。,#include void main() int *1,*2,*,;scanf(,);1;if()&

5、b;&a;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 *,in

6、t *) 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 tem

7、p;temp*;*;*temp;,10.3 数组与指针,一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元素的地址。,定义一个指向数组元素的指针变量的方法,与以前介绍的指向变量的指针变量相同。 例如: ;(定义为包含个整型数据的数组) *; (定义为指向整型变量的指针变量) 应当注意,如果数组为型,则指针变量的基类型亦应为型。,10.3.1 指向数组元素的指针,对该指针变量赋值: ; 把元素的地址赋给指针变量。也就是使指向数组的第号元素

8、,如图:,10.通过指针引用数组元素,引用一个数组元素,可以用:() 下标法,如形式;() 指针法,如*()或*()。其中是数组名,是指向数组元素的指针变量,其初值。,例10.5 输出数组中的全部元素。,假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:,(1)下标法。 #include void main() int ;int ;for(;)scanf(,);printf();for(;)printf(,);,(2) 通过数组名计算数组元素地址,找出元素的值。 #include void main() int ;int ;for(; )scanf(,);printf();for(;

9、)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 显然输出的数值并不是数组中各元素的值,#

10、include void main() int*,;for(;)scanf(,);printf();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 (,);

11、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(;)pr

12、intf (,);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

13、 ; (,); ,(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(,);pri

14、ntf();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 ,;fo

15、r(;);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 , *();

16、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

17、,7,9,11,13,15,17,19,21,23;int*;for(;)()printf();printf(,*); ,运行结果如下: 1 3 5 79 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 有一个班,个学生,各学门课,计算总平均分数以及第个学生的成绩。

18、这个题目是很简单的。只是为了说明用指向数组的指针作函数参数而举的例子。用函数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

19、*_;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

20、() 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: . .

21、 . .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() char*string I love China!;p

22、rintf(,); ,例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(st

23、ring 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(“

24、nstring a=%snstring b=%sn“,a,b); ,(1) 用字符数组作参数,void copy_string(char from , char to ) int ;while(from!)tofrom;to;,程序运行结果如下:string aI am a teacherstring b you are a studentcopy string a to string b: string a I am a teacher stringI am a teacher,(2) 形参用字符指针变量,#include void main() void copy_string(char

25、* 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_stri

26、ng (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(

27、;*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 对使用字符指针变量

28、和字符数组的讨论,字符数组和字符指针变量二者之间的区别:,(3)对字符指针变量赋初值:char * love China!;等价于char*;I love China!;而对数组的初始化:char str love China!;不能等价于char str;str I love China!;,(4) 定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址。,例如: char str;scanf(,str);,(5) 指针变量的值是可以改变的,例如:,例10.0 改变指针变量的值,#include void

29、 () 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

30、(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

31、),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 ,;pr

32、intf(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) i

33、nt result;result(*fun)(,);printf(, result); ,10. 返回指针值的函数,一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。 这种带回指针值的函数,一般定义形式为 类型名 *函数名(参数表列); 例如: int *(int ,int );,例104 有若干个学生的成绩(每个学生有门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。,#include void main() float *score 4=60,70,80,90,56,89,67,8

34、8,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.

35、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 指针数组的概念,一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,

36、指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为: 类型名数组名数组长度;例如: *;,例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 *;in

37、t ,;for(;for(;if(strcmp(name,name)0)=;if(!)temp=namei; namei=namek;namek=temp;,void print(char * ,int ) ;(;)printf(,);,运行结果为: Computer design FORTRAN Follow me Great Wall,10.7.2 指向指针的指针,定义一个指向指针数据的指针变量: *; 的前面有两个*号。*运算符的结合性是从右到左,因此*相当于*(*),显然*是指针变量的定义形式。如果没有最前面的*,那就是定义了一个指向字符数据的指针变量。现在它前面又有一个*号,表示指针变量是指向一个字符指针变量的。*就是所指向的另一个指针变量。,例10.7 使用指向指针的指针。,#include void main() char *name=“Follow me“,“BASIC“,“Great Wall,“FORTRAN“,“Computer design“;char *;int ;for(;);printf(,*);,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报