C语言-第6章指针(成).ppt
《C语言-第6章指针(成).ppt》由会员分享,可在线阅读,更多相关《C语言-第6章指针(成).ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第6章章 指针指针n指针的概念指针的概念n变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量n数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量n字符串的指针和指向字符串的指针字符串的指针和指向字符串的指针变量变量n函数的指针和指向函数的指针变量函数的指针和指向函数的指针变量n返回指针值的函数返回指针值的函数n指针数组和指向指针的指针指针数组和指向指针的指针第第6 6章作业章作业实验实验10101指针的概念指针的概念1、内存单元,内存地址;不同数据类型占用内存、内存单元,内存地址;不同数据类型占用内存单元数(字节数)不同,如单元数(字节数)不同,如2、变量名,变量的地址,
2、变量的值、变量名,变量的地址,变量的值如:如:int i=10;10变量名:变量名:i变量的地址:变量的地址:&i,2000变量变量i的值:的值:102000p30003、指针:地址、指针:地址 变量的指针:变量的地址变量的指针:变量的地址指针变量:专门存放指针(地址)的变量指针变量:专门存放指针(地址)的变量 指针变量的值:指针(地址)指针变量的值:指针(地址)如上例,如上例,p称为称为“指针变量指针变量”;i的指针:的指针:&i,2000;p的指针:的指针:&p,3000;i的值:的值:10;p的值:的值:2000。i20002指针的概念指针的概念 严格地说,一个严格地说,一个指针是指针是
3、一个地址,是一个常量;一个地址,是一个常量;而一个而一个指针指针变量却可以被赋予不同的变量却可以被赋予不同的指针指针值,是变值,是变量。但是常把量。但是常把指针指针变量简称为变量简称为“指针指针”。为了避免。为了避免混淆,我们约定:混淆,我们约定:“指针指针”是指地址,是常量,是指地址,是常量,“指针指针变量变量”是指取值为地址的变量。是指取值为地址的变量。定义定义指针指针的的目的是为了通过目的是为了通过指针指针去访问内存单元。去访问内存单元。3变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量一、指针变量的定义及引用一、指针变量的定义及引用1、定义、定义类型标识符类型标识符*指针变
4、量名;指针变量名;如:如:int i=10;p i int*p;2000 10 p=&i;/*让让p指向指向i*/3000 20002、引用、引用(1)&取地址符取地址符(2)*指针运算符指针运算符如:如:int i=10,*p;p=&i;printf(“%d”,*p);*p表示:表示:p所指变量,所指变量,i&i表示:表示:i的地址,的地址,2000 4变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量&p表示:表示:p的地址,的地址,3000i的值为:的值为:10 p的值为:的值为:2000由此可见:存取变量由此可见:存取变量i的值有两种方式:的值有两种方式:直接访问:按变量直接
5、访问:按变量i的地址存取的地址存取i的值。的值。间接访问:将变量间接访问:将变量i的地址存放在另一个变量的地址存放在另一个变量p中,中,存取时:先找到存放存取时:先找到存放“i的地址的地址”的变量的变量p,从中取出,从中取出i的地址;再到该地址处存取的地址;再到该地址处存取i的值。的值。注意:(注意:(1)区分)区分p,*p,&p(2)&和和*可看作是一对互逆运算符可看作是一对互逆运算符如:如:int i=10,*p;p=&i;则则&(*p)*(&i)=&i=p=*p=i5变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量【附例附例7.1】#includemain()int a,b;
6、int *p1,*p2;a=100;b=10;p1=&a;p2=&b;printf(%d,%dn,a,b);printf(%d,%dn,*p1,*p2);运行结果为:运行结果为:100,10 100,10注意:程序中有注意:程序中有两处出现两处出现*p1和和*p2,请区分它,请区分它们的不同含义。们的不同含义。6变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量P153【例例7-1】输入输入a和和b两个整数,按先大后两个整数,按先大后小的顺序输出小的顺序输出a和和b。方法一:方法一:main()int *p1,*p2,*p,a,b;p1=&a;p2=&b;scanf(“%d%d”,p
7、1,p2);if (*p1*p2)p=p1;p1=p2;p2=p;printf(a=%d,b=%dn,a,b);printf(max=%d,min=%dn,*p1,*p2);运行情况如下:运行情况如下:6 8 a=6,b=8 max=8,min=6交换交换p1和和p2的指向,并没有交的指向,并没有交换换p1和和p2所指变量的值所指变量的值7变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量方法二:方法二:main()int *p1,*p2,a,b,t;p1=&a;p2=&b;scanf(“%d%d”,p1,p2);if (*p1q表示表示p处于高地处于高地址位置;址位置;pq表示表示
8、p处于低地址位置;处于低地址位置;p=0表示表示p是空指针,不指向任何变量,在是空指针,不指向任何变量,在C中将中将p赋赋值为空指针通常采用如下形式:值为空指针通常采用如下形式:#define NULL 0int*p=NULL;注意注意:(1)指针变量的类型必须与其所指变量的类型相一致。)指针变量的类型必须与其所指变量的类型相一致。(2)区分)区分*p+,*+p,(*p)+,+(*p)*(p+)*(+p)11变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量三、指针变量作函数参数三、指针变量作函数参数单向的单向的“值传递值传递”【例例6-2】输入两数,交换两数的值后再输出。输入两数,
9、交换两数的值后再输出。程序程序1:void swap(int x,int y)int t;t=x;x=y;y=t;main()int a,b;scanf(“%d%d”,&a,&b);swap(a,b);printf(“%d,%dn”,a,b);程序程序1运行情况:运行情况:输入:输入:10 20 输出:输出:10,20数据传递过程:数据传递过程:实参实参 形参形参 a x b y10102020201012变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量程序程序2运行情况:运行情况:输入:输入:10 20 输出:输出:20,10程序程序2:void swap(int*x,int*y
10、)int t;t=*x;*x=*y;*y=t;main()int a,b;int*p1=&a,*p2=&b;scanf(“%d%d”,&a,&b);swap(p1,p2);printf(“%d,%dn”,a,b);数据传递过程:数据传递过程:实参指针变量实参指针变量 形参指针变量形参指针变量 p1 a x p2 b y&a 10&a&b&b202010或者:无需定义或者:无需定义p1,p2,函数调用时将,函数调用时将实参改为实参改为&a,&b,如,如P165程序二程序二13变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量程序程序3:void swap(int*x,int*y)int
11、*t;t=x;x=y;y=t;main()int a,b;int*p1=&a,*p2=&b;scanf(“%d%d”,&a,&b);swap(p1,p2);printf(“%d,%dn”,a,b);程序程序3运行情况:运行情况:输入:输入:10 20 输出:输出:10,20数据传递过程:数据传递过程:实参指针变量实参指针变量 形参指针变量形参指针变量 p1 a x p2 b y&a 10&a&b&b20&a&b14变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量由此可见:由此可见:(1)当指针变量作函数参数时,仍遵循)当指针变量作函数参数时,仍遵循“单向值传单向值传递递”的规则,即
12、:将实参指针变量的值(即它所指的规则,即:将实参指针变量的值(即它所指变量的地址)传给形参指针变量,此时,变量的地址)传给形参指针变量,此时,形参指针形参指针与实参指针指向同一变量与实参指针指向同一变量。所以,形参指针变量所。所以,形参指针变量所指变量的值的改变会引起实参指针变量所指变量的指变量的值的改变会引起实参指针变量所指变量的值的改变。这样,经函数调用后,就使得主调函数值的改变。这样,经函数调用后,就使得主调函数中某些变量的值产生了变化。中某些变量的值产生了变化。而普通变量作参数时,形参值的改变不会影响实参而普通变量作参数时,形参值的改变不会影响实参值,也就是说,经调用后,不会使得主调函
13、数中变值,也就是说,经调用后,不会使得主调函数中变量的值产生变化。量的值产生变化。反过来说,如果希望经函数调用后,主调函数中变反过来说,如果希望经函数调用后,主调函数中变量的值产生变化,只能用指针变量作参数。量的值产生变化,只能用指针变量作参数。15变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量编程:输入两数,交换两数的值后再输出。编程:输入两数,交换两数的值后再输出。分析步骤:(分析步骤:(1)输入;()输入;(2)交换;()交换;(3)输出。)输出。学习函数之前编写的程序学习函数之前编写的程序1:main()int a,b,t;scanf(“%d%d”,&a,&b);t=a;
14、a=b;b=t;printf(“%d,%dn”,a,b);学习函数之后编写的程序学习函数之后编写的程序2:void swap(int x,int y)int t;t=x;x=y;y=t;main()int a,b;scanf(“%d%d”,&a,&b);swap(a,b);printf(“%d,%dn”,a,b);16变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量学习指针之后编写的程序学习指针之后编写的程序3:void swap(int*x,int*y)int t;t=*x;*x=*y;*y=t;main()int a,b;scanf(“%d%d”,&a,&b);swap(&a,
15、&b);printf(“%d,%dn”,a,b);17变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量问:问:普通变量作参数时,怎样进行数据传递?普通变量作参数时,怎样进行数据传递?指针变量作参数时,怎样进行数据传递?指针变量作参数时,怎样进行数据传递?普通变量作参数时,形参值的改变会不会影响普通变量作参数时,形参值的改变会不会影响实参值?实参值?指针变量作参数时,形参指针变量的值的改变指针变量作参数时,形参指针变量的值的改变会不会影响实参指针变量的值?会不会影响实参指针变量的值?指针变量作参数时,形参指针变量所指变量的指针变量作参数时,形参指针变量所指变量的值的改变会不会影响实参
16、指针变量所指变量的值的改变会不会影响实参指针变量所指变量的值?值?单向的值传递单向的值传递单向的值传递单向的值传递不会不会不会不会会会18变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量(2)编程时,若要定义子函数,需要对其形参作分)编程时,若要定义子函数,需要对其形参作分析,分析哪些形参应定义成指针变量。对于那些经析,分析哪些形参应定义成指针变量。对于那些经函数调用后其值会产生变化的形参,将其定义成指函数调用后其值会产生变化的形参,将其定义成指针变量,函数体中相应地方修改成针变量,函数体中相应地方修改成*p;相应实参修;相应实参修改成实参的地址或指针变量。(如:例改成实参的地址或
17、指针变量。(如:例6-2中的程序中的程序2)练习:练习:P198:619数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量int a10;数组的指针:数组的起始地址(数组的指针:数组的起始地址(&a0或或a)数组元素的指针:数组元素的地址(数组元素的指针:数组元素的地址(&ai)一、指向一维数组的数组元素的指针变量的一、指向一维数组的数组元素的指针变量的定义与赋值定义与赋值int a10,*p;p=&a0或或a;20二、通过指针引用一维数组的数组元素二、通过指针引用一维数组的数组元素数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量1、p+i或或a+i指向指向ai,其值为其
18、值为&ai;*(p+i)或或*(a+i)表示表示它所指元素它所指元素ai或或pi2、引用一个数组元素,、引用一个数组元素,可以用:可以用:(1)下标法:)下标法:ai或或pi(2)指针法:)指针法:*(a+i)或或*(p+i)a0a1aia9a数组数组p,ap+1,a+1p+i,a+ip+9,a+921数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量由此可见:由此可见:一维数组中,元素地址的表示方式有:一维数组中,元素地址的表示方式有:&ai,a+i,p+i元素值的表示方式有:元素值的表示方式有:ai,*(a+i),*(p+i)22数组的指针和指向数组的指针变量数组的指针和指向数组
19、的指针变量【例例】输入一个整型数组并输出。输入一个整型数组并输出。(1)下标法()下标法(ai)main()int a10,i;for(i=0;i10;i+)scanf(“%d”,&ai);for(i=0;i10;i+)printf(“%7d”,ai);(2)地址法()地址法(*(a+i))main()int a10,i;for(i=0;i10;i+)scanf(“%d”,a+i);for(i=0;i10;i+)printf(“%7d”,*(a+i);23数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量(3)指针变量()指针变量(*p)main()int a10,i,*p=a;fo
20、r(i=0;i10;i+,p+)scanf(“%d”,p);p=a;for(i=0;i10;i+,p+)printf(“%7d”,*p);或或for(;pa+10;p+)或或for(;p ;p+)a+1024注意:指向数组的指针变量与数组名的关系。注意:指向数组的指针变量与数组名的关系。(1)两者的表现形式是等价的,如两者的表现形式是等价的,如p+i,a+i均指向均指向ai,数组元素可表示为,数组元素可表示为ai或或pi。(2)两者在本质上又是不同的,指针是地址变量,其两者在本质上又是不同的,指针是地址变量,其值可以改变,如值可以改变,如p+是合法的。而是合法的。而a+是错误的,是错误的,因为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 指针
限制150内