语言课件之第10章指针.ppt

上传人:本田雅阁 文档编号:3307189 上传时间:2019-08-10 格式:PPT 页数:109 大小:656.04KB
返回 下载 相关 举报
语言课件之第10章指针.ppt_第1页
第1页 / 共109页
语言课件之第10章指针.ppt_第2页
第2页 / 共109页
语言课件之第10章指针.ppt_第3页
第3页 / 共109页
语言课件之第10章指针.ppt_第4页
第4页 / 共109页
语言课件之第10章指针.ppt_第5页
第5页 / 共109页
点击查看更多>>
资源描述

《语言课件之第10章指针.ppt》由会员分享,可在线阅读,更多相关《语言课件之第10章指针.ppt(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_;,在定义指针变量时要注意两点:,1

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

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

5、,*,; 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 ); pri

6、ntf(,); ,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(*

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

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

9、de 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

10、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 将数组中个整数按相反顺序存放。,#inclu

11、de 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 h

12、as 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,*,*,(); ; fo

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

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

15、; ,例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. 多维数组元素的地址,先回顾一下多维数组的性质,可以认为二维数组是“数

16、组的数组”,例 : 定义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列元素地址)

17、, (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) 指向由个元素组成的一维数组的指针变

18、量,例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(

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

20、 ) / * 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;

21、 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 定义一个字符数组,对它

22、初始化, 然后输出该字符串,#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(;*()!;

23、) *()*(); *(); 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(); ,程序必须保证使和同步

24、移动,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 co

25、py_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 *y

26、ou 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)!)

27、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_str

28、ing可写为 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 对使用字符指针变量和字符数组的讨论,字符数组和字符指针变量二者之

29、间的区别:,(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 lov

30、e 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,

31、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 voi

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

33、(); /* 函数声明 */ 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

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

35、n() 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 numb

36、er 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();

37、,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

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

当前位置:首页 > 其他


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