收藏 分享(赏)

【程序设计基础】第10章_指针.ppt

上传人:dreamzhangning 文档编号:3321678 上传时间:2018-10-13 格式:PPT 页数:75 大小:540.50KB
下载 相关 举报
【程序设计基础】第10章_指针.ppt_第1页
第1页 / 共75页
【程序设计基础】第10章_指针.ppt_第2页
第2页 / 共75页
【程序设计基础】第10章_指针.ppt_第3页
第3页 / 共75页
【程序设计基础】第10章_指针.ppt_第4页
第4页 / 共75页
【程序设计基础】第10章_指针.ppt_第5页
第5页 / 共75页
点击查看更多>>
资源描述

1、第十章,指针,10.1地址和指针的概念,内存区的每一个字节有一个编号,这就是“地址” 。,地址:,又叫“指针”,int型变量i的值是3,地址是2000;有一个指针ipointer,值为2000;那么这个ipointer就指向以其值2000为地址的内存单元,即,指向变量i,如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”。 i_pointer就是一个指针变量。,指针变量:,这种变量的值是某变量的地址,可以指向以该值为地址的单元类型是一个指针,指针变量除了类型是指针外,会不会涉及其它类型? 指针变量需不需要区分究竟它所指向的内存单元中的数据是什么类型的? 之所以要用指针变量

2、,就是希望能够通过它直接访问某个内存单元中的数据,既然要访问这些数,必然涉及到这些数的操作,既然有操作,必然和类型相关。所以定义指针型变量时,必须指明该指针变量所指向的内存单元中数据的类型,10.2 变量的指针和指向变量的指 针变量,10.1 定义一个指针变量,要定义一个指针变量,要指明两种类型,一种是指针型,一种是所指向的单元中数据的类型 基本格式为 所指向的数据类型 *指针变量名 如int *i_point; float *f_point_a; char *c_point1;,在定义指针变量时要注意两点:,指针变量前面的“*”,表示该变量的类型为指针型变量。 例: float *point

3、er_1; 指针变量名是pointer_1 ,而不是* pointer_1 。,(2) 在定义指针变量时必须指定基类型。 只有整型变量的地址才能放到指向整型变量的指针变量中。float a; int * pointer_1; 想将变量a的地址赋给指针变量pointer_1是错误的,10.2.2 指针变量的引用,给它赋值 ,用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向一个该变量。 例如: pointer_; pointer_;,从它取值 *指针运算符,表示紧跟在其后的那个指针变量所指向的内存单元 *指针变量名 如,*i_point, j=*i_point;,注意:,指针变量只有赋值

4、后才能使用,使用没有被赋值的指针变量会很危险,有可能造成系统瘫痪 给指针变量赋值时,一定要注意类型的一致 可将一个已赋值的指针赋给另一个同类型的指针,如:int a,*p,*q; p=,例10. 通过指针变量访问整型变量,#include void main ( ) int ,;int *pointer_, *pointer_;pointer_; /*把变量的地址赋给 pointer_1 */ pointer_; /*把变量的地址赋给pointer_ */printf(%,%,);printf(%,%,*pointer_, *pointer_);,对“”和“*”运算符说明: 如果已执行了语句

5、pointer_; (1)* pointer_的含义是什么?,“”和“*”两个运算符的优先级别相同,但按自右而左方向结合。因此,* pointer_与相同,即变量a的地址。 * pointer_与pointer_等价。如果有pointer_2 * pointer_ ;它的作用是将(的地址)赋给pointer_2 ,如果pointer_2原来指向,经过重新赋值后它已不再指向了,而指向了。,(2) *的含义是什么?,(3) (*pointer_)相当于。,*point_1+ 相当于 *(point_1+)求出point_1所指向的单元中的值,然后point_1中的地址增1个单位(根据指针类型决定单

6、位字节数),先进行运算,得的地址,再进行*运算。*和*pointer_的作用是一样的,它们都等价于变量。即*与等价。,例10 . 2 输入和两个整数,按先大后小的顺序输出和。,#include void main() int *1,*2,*,;scanf(,);1;if();printf(=,=,);printf(max=,min=,*1,*2); ,运行情况如下: , , ,,指针可以作为函数的形参和实参传址调用。若将存放变量的地址传给被调函数,被调函数的形参必须是指针型变量。 在被调函数中可以通过间接访问的方式得到或修改实参的内容。 这种方法使数据传输安全可靠,而且可以实现多个数据的双向传

7、递。,10.3 指针变量作为函数参数,#include void swap(int,int); void main( ) int a,b; a=2,b=6;if (ab) swap(a,b);printf(“%d,%d”,a,b); ,void swap(int x, int y) int temp;temp=x;x=y;y=temp;/printf(“%d,%d”,x,y);,例10 . 3 对输入的两个整数按大小顺序输出,#include void main() void swap(int *p1,int *p2);int a,b;int *pointer_1,*pointer_2;a=5

8、;b=9;pointer_1= ,void swap(int *p1,int *p2) int temp;temp=*p1;*p1=*p2;*p2=temp; ,*1,返回值方式,但只能返回一个值。 使用全局变量,可以传递多个值,但是不安全。 传址调用,可以传递多个值,而且安全。,函数间数据“双向”传递的方法:,10.3 数组与指针,数组元素的指针就是数组元素的地址。 数组的指针就是数组的首地址,例如: ; *;,10.3.1 指向数组元素的指针,一维数组名表示数组的首地址。(或用 &数组名0 表示。)&数组名下标表示某个一维数组元素的地址。若把数组名或数组元素的地址赋给指针变量,就可以利用对

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

10、元素地址,找出元素的值。 #include void main() int ;int ;for(; )scanf(,);printf();for(;)printf(,*();,(3) 用指针变量指向数组元素。 #include void main() int ;int *,;for(;)scanf(,);printf();for(;();)printf( ,*);,任何数组元素的地址都是系统分配的,它们属于指针常量,只能使用不能修改。 数组名是常量,不能改。,例:计算字符串的长度。 #include “stdio.h“ void main() char s=“abc def“,*p=s;whi

11、le(*p)p+;printf(“The string length is %dn“,p-s);,运行结果如下: The string length is 7,10.3 用数组名作函数参数,void main()(int arr,int ); int array;(array,); int (int arr,int ) ,实参是一维数组名,即一维数组的首地址。形参应为与实参数组同数据类型的数组或指针变量,例10 将数组中个整数按相反顺序存放。,#include void main() void inv(int ,int );int ,;printf(The original array:);f

12、or(;)printf (,);printf();inv (,);printf(The array has been in verted:);for(;)printf (,);printf (); ,void inv(int ,int ) /*形参x是数组名*/ int temp,();for(;);temp;temp;return;,#include void main() void inv(int *,int );int ,;printf( The original array: );for(;)printf (,);printf ();inv(,);printf ( The array

13、has been in verted: );for(;)printf (,);printf ();,对刚才的程序可以作一些改动。将函数inv中的形参改成指针变量。,void inv(int *,int ) /*形参x为指针变量*/ int,temp,*,*,();for(;,)temp*;*;*temp;return; ,如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下种情况:,(1) 形参和实参都用数组名,如:void main() void (int ,int ) int ; (,); ,(2) 实参用数组名,形参用指针变量。如: void () void

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

15、has been inverted :);for(; )printf(,*);printf();,void inv(int *,int ) int ,temp,*,*;();for(;,) emp*;*;*temp;return;,例109 用选择法对个整数按由大到小顺序排序。,#include void main() void sort(int x ,int n);int *p,i,a10;p=a;for(i=0;i10;i+)scanf(“%d“,p+);p=a;sort(p,10);for(p=a,i=0;i10;i+) printf(“%d“,*p);p+; ,void sort(in

16、t x ,int n) int i,j,k,t;for(i=0;ixk) k=j;if(k!=i) t=xi;xi=xk;xk=t;,*(xj),*(xk),10. 字符串与指针,10.4.字符串的表示形式,例 10.5 定义一个字符数组,对它初始化,然后输出该字符串,#include void main() char stringI love China!;printf(,string);,(1) 用字符数组存放一个字符串,然后输出该字符串。,(2) 用字符指针指向一个字符串。 可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。,例106 定义字符指针 #include

17、void main() char *string=“ I love China!“;printf(“%sn“,string); ,char *string;scanf(“%s“,string);,X,例10.7 将字符串复制为字符串。,#include void () char am a boy,20;int ;for(;*()!;)*()*();*();printf(string a is :,);printf(string b is:);for(;!;)printf(,);printf();,b=ai,puts(b),也可以设指针变量,用它的值的改变来指向字符串中的不同的字符。,例10.8

18、 用指针变量来处理例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 字符指针作函数参数,实参:数组名、字符指针变量形参:数组名、字符指针变量,(1) 字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址(字符串第1个字符的地址),决不是将字符串放到字符指针变量中。 (2)赋值方式。对字符数组只能对

19、各个元素赋值,不能用以下办法对字符数组赋值。char str14;str=“I 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) 定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而

20、定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址。,例如: char str;scanf(,str);,(5) 指针变量的值是可以改变的,10.7 指针数组和指向指针的指针,10.7.1 指针数组的概念,一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。一维指针数组的定义形式为: 类型名 *数组名数组长度;例如: char *;,例10.6 将若干字符串按字母顺序(由小到大)输出。,#include #include void main() void sort(char *name,int n);void pr

21、int(char *name,int n);char *name=“Follow me“,“BASIC“,“Great Wall“,“FORTRAN“,“Computer design“;int n=5;sort(name,n);print(name,n); ,void sort(char *name,int n) char *temp;int i,j,k;for(i=0;i0) k=j;if(k!=i)temp=namei;namei=namek;namek=temp; ,void print(char *name,int n) int i;for(i=0;in;i+)printf(“%sn

22、“,namei); ,运行结果为: Computer design FORTRAN Follow me Great Wall,10.7.2 指向指针的指针,定义一个指向指针数据的指针变量: *; 根据“ * ”运算符的结合性,*相当于*(*) *是指针变量的定义形式,定义了一个指向字符数据的指针变量。 前面又有一个*号:表示指针变量是指向一个字符指针变量的。*就是所指向的另一个指针变量。,例10.7 使用指向指针的指针。,#include void main() char *name=“Follow me“,“BASIC“,“Great Wall,“FORTRAN“,“Computer des

23、ign“;char *;int ;for(;);printf(,*);,例10.28 一个指针数组的元素指向整型数据的简单例子。,#include void main() int ,;int *num5=&a0,&a1,&a2,&a3,&a4;int *,;for(;) printf( ,*);,运行结果为: 1 3 5 7 9,10.7.3 指针数组作main函数的形参,指针数组的一个重要应用是作为main函数的形参。 void main()不带参数的main函数 执行该程序:直接输入exe文件的名字(命令名)main函数可以有参数,例如: void main(int argc,char *

24、argv )。命令行的一般形式为命令名 参数 参数参数,例如一个名为file的文件,它包含以下的main函数:,#include void main(int argc,char *argv) while(argc1)+argv;printf(“%sn“,*argv);-argc; ,在DOS命令状态下输入的命令行为 则执行以上命令行将会输出以下信息: ,10.8有关指针的数据类型和 指针运算的小结,10.8.1有关指针的数据类型的小结,10.8.2 指针运算小结,(1) 指针变量加(减)一个整数 例如:、等。 加减的单位为该指针所对应的数据类型所占内存的长度,(2) 指针变量赋值 将一个变量地

25、址赋给一个指针变量。如: ; (将变量的地址赋给) array; (将数组首元素地址赋给) array;(将数组第个元素的地址赋给)指针变量的引用a=*p; ;(和都是指针变量,将的值赋给),(3) 指针变量可以有空值,即该指针变量不指向任何变量。,(4) 两个指针变量可以相减 如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数 。,作业:,10.7 10.9 10.14 10.16,#include void main( ) int a20,*p4 , i=0 , k=0 ;for ( ; i20 ;i+) ai= i ; for ( i=0 ; i4 ;

26、+i ) pi= ,运行结果为: k=26,#include #include void fun(char *w,int m) char s,*p1,*p2;p1=w;p2=w+m-1;while(p1p2) s=*p1+;*p1=*p2-;*p2=s; void main() static char a =“ABCDEFG“;fun(a,strlen(a);puts(a); ,运行结果为: AGAAGAG,#include main() int a34=1,2,3,4,5,6,7,8,9,10,11,12;int i,j,*p= ,运行结果为:1 2 3 45 6 7 89 10 11 12,

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

当前位置:首页 > 高等教育 > 大学课件

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


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

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

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