《(8)--第8章C语言程序设计指针.ppt》由会员分享,可在线阅读,更多相关《(8)--第8章C语言程序设计指针.ppt(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第八章第八章 指针指针C语言程序设计 8.1 8.1 地址和指针的概念地址和指针的概念2.2.变量值的存取方式:变量值的存取方式:(1)(1)按变量地址存取变量值的方式称为按变量地址存取变量值的方式称为“直接访问直接访问”方方式式 scanf(“%d”,&i);printf(“%d”,i);k=i+j;1.1.变量的地址:系统为变量分配的内存单元就是变量的地址:系统为变量分配的内存单元就是变量的地址。如果在程序中定义了一个变量,在变量的地址。如果在程序中定义了一个变量,在对程序进行编译时,系统就会给这个变量分配内对程序进行编译时,系统就会给这个变量分配内存单元。存单元。用用&a&a来表示变量来
2、表示变量a a的地址。的地址。C语言程序设计(2)(2)另一种存取变量值的方式称为另一种存取变量值的方式称为“间接访问间接访问”的方的方式。即,将变量的地址存放在另一个变量中。式。即,将变量的地址存放在另一个变量中。在语言中,指针是一种特殊的变量,它是存放地址的在语言中,指针是一种特殊的变量,它是存放地址的C语言程序设计一个变量的地址称为该变量的一个变量的地址称为该变量的“指针指针”。例如,地址例如,地址2000是变量的指针。如果有一个变是变量的指针。如果有一个变量专门用来存放另一变量的地址(即指针),则量专门用来存放另一变量的地址(即指针),则它称为它称为“指针变量指针变量”。上述的。上述的
3、i_pointer就是一就是一个指针变量。个指针变量。指针和指针变量的定义:指针和指针变量的定义:C语言程序设计 8.2 8.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量“*”表示指向的对象,表示指向的对象,i_pointer指针变量所指向的对象指针变量所指向的对象可以用可以用*i_pointer来表示,所以来表示,所以*i_pointer等价于等价于i。i=3;等价于等价于 *i_pointer=3;C语言程序设计可以用赋值语句使一个指针变量得到另一个变量的地址,可以用赋值语句使一个指针变量得到另一个变量的地址,从而使它指向该变量。从而使它指向该变量。例如:例如:poin
4、ter_;pointer_;定义指针变量的一般形式为定义指针变量的一般形式为基类型基类型 *指针变量名;指针变量名;8.2.1 8.2.1 定义一个指针变量定义一个指针变量 float *pointer_1;char*pointer_2;C语言程序设计在定义指针变量时要注意两点:在定义指针变量时要注意两点:(1)指针变量前面的指针变量前面的“*”,表示该变量的类型为指针型,表示该变量的类型为指针型变量。变量。例例:float *pointer_1;指针变量名是指针变量名是pointer_1,而不是,而不是*pointer_1。(2)在定义指针变量时必须指定基类型。在定义指针变量时必须指定基类型
5、。指针变量的基类型要和它所指向的变量类型一致。指针变量的基类型要和它所指向的变量类型一致。float a;int *pointer_1;pointer_1=&a;C语言程序设计8.2.2 8.2.2 指针变量的引用指针变量的引用 注意注意:指针变量中只能存放地址(指针)指针变量中只能存放地址(指针)不要将一个整数(或任何其他非地址类型的数据)不要将一个整数(或任何其他非地址类型的数据)赋给一个指针变量。赋给一个指针变量。如:如:int*pointer_1;pointer_1=100;例例10.10.通过指针变量访问整型变量通过指针变量访问整型变量#include voidmain()int,;
6、,;int*pointer_,*pointer_;pointer_;/*把变量的地址赋给 pointer_1*/C语言程序设计pointer_;/*把变量的地址赋给把变量的地址赋给 pointer_*/printf(%,%,););printf(%,%,*pointer_,*pointer_););运行结果:运行结果:100100,1010100100,1010 C语言程序设计对对“”和和“*”运算符说明:运算符说明:如果已执行了语句如果已执行了语句 pointer_;(1)*pointer_的含义是什么?的含义是什么?“”和和“*”两个运算符的优先级别相同,但按两个运算符的优先级别相同,但按
7、自右而左方向结合。因此,自右而左方向结合。因此,*pointer_与相与相同,即变量同,即变量a的地址。的地址。如果有如果有pointer_2*pointer_;它的作用是;它的作用是将(的地址)赋给将(的地址)赋给pointer_2,如果,如果pointer_2原来指向,经过重新赋值后它已不再指向了,而原来指向,经过重新赋值后它已不再指向了,而指向了。指向了。C语言程序设计C语言程序设计如果已经执行了如果已经执行了pointer_1=&a;(2)*的含义是什么?的含义是什么?p 先进行运算,再进行先进行运算,再进行*运算。运算。p 和和pointer_的作用是一样的,的作用是一样的,p*&a
8、就等价于就等价于*pointer_,它们都等价于变量。,它们都等价于变量。即即*与等价与等价。(3)(*pointer_)相当于)相当于。C语言程序设计例例10.2 输入和两个整数,按先大后小的顺序输出输入和两个整数,按先大后小的顺序输出 和。和。#include void main()()int*1,*2,;,;scanf(,);,);printf(=,=,););1;if()()&b;&a;printf(max=,min=,*1,*p2););if(ab)t=a;a=b;b=t;printf(“max=%d,min=%dn”,*p1,*p2);C语言程序设计运行情况如下:运行情况如下:,当
9、输入,时,由于,当输入,时,由于,将和交换。交换前的情况见图将和交换。交换前的情况见图(),交换后见图()。(),交换后见图()。C语言程序设计 if()()&b;&a;C语言程序设计小结小结 1l 指针:指针:地址地址l 指针变量:指针变量:存放地址的变量存放地址的变量l 指针变量的定义:指针变量的定义:int*p;l 指针变量的引用:指针变量的引用:存放谁的地址,就指向谁存放谁的地址,就指向谁l&和和*运算符:运算符:优先级相同,自右向左优先级相同,自右向左C语言程序设计习题习题10.1 输入输入3个整数,按由小到大的顺序输出个整数,按由小到大的顺序输出#includevoid main(
10、)int a,b,c,t;int*p1,*p2,*p3;printf(“input a,b,c:”);scanf(“%d,%d,%d”,&a,&b,&c);p1=&a;p2=&b;p3=&c;if(ab)t=*p1;*p1=*p2;*p2=t;if(ac)t=*p1;*p1=*p3;*p3=t;if(bc)t=*p2;*p2=*p3;*p3=t;printf(“the order is:%d,%d,%dn”,*p1,*p2,*p3);运行结果:运行结果:input a,b,c:34,21,25 the order is:21,25,34 C语言程序设计8.2.3 8.2.3 指针变量作为函数参
11、数指针变量作为函数参数例例8.3 对输入的两个整数按大小顺序输出对输入的两个整数按大小顺序输出 C语言程序设计#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;printf(“%d,%dn”,*pointer_1,*pointer_2);C语言程序设计C语言程序设计
12、 8.3 8.3 数组与指针数组与指针 1.数组是数组是连续存放连续存放的若干元素的的若干元素的集合。集合。2.数组名数组名a代表该数组的首地址,代表该数组的首地址,也就是首元素的地址,也就是首元素的地址,a等价于等价于&a0例:例:int*p;int a10;p=&a0;等价于等价于p=a;3.数组中某一元素的地址数组中某一元素的地址&ai,用指针变量指向该元素用指针变量指向该元素p=&aiC语言程序设计4.数组元素的下标在系统内部统一按数组元素的下标在系统内部统一按“基地址基地址+位移位移”的方法处理的方法处理a等价于等价于&a0 a+i 等价于等价于&ai表示数组元素的地址表示数组元素的
13、地址:&ai a+i p+i 表示数组元素的内容:表示数组元素的内容:ai *(a+i)*(p+i)pi数组名数组名a与指针变量与指针变量p的意义不同的意义不同a是常量,永远只表示是常量,永远只表示&a0p是变量,它可以随时改变指向的数组是变量,它可以随时改变指向的数组元素元素C语言程序设计8.3.2 8.3.2 通过指针引用数组元素通过指针引用数组元素引用一个数组元素,可以用:引用一个数组元素,可以用:()()下标法,如形式;下标法,如形式;()()指针法,如指针法,如*()或()或*()。()。其中是数组名,是指向数组元素的指针变量,其初其中是数组名,是指向数组元素的指针变量,其初值。值。
14、例例10.5 输出数组中的全部元素。输出数组中的全部元素。假设有一个数组,整型,有个元素。要输出假设有一个数组,整型,有个元素。要输出各元素的值有三种方法:各元素的值有三种方法:C语言程序设计(1)下标法下标法#include void main()()int;int;for(;)(;)scanf(,);,);printf(););for(;)(;)printf(,);,);C语言程序设计(2)通过数组名计算数组元素地址,找出元素的值通过数组名计算数组元素地址,找出元素的值#include voidmain()()int;int;for(;(;)scanf(,a+i););printf();)
15、;for(;)(;)printf(,*();();C语言程序设计(3)用指针变量指向数组元素用指针变量指向数组元素#include void main()()int;int *,;,;for(;)(;)scanf(,a+i););printf(););for(;();)(;();)printf(,*););C语言程序设计例例8.通过指针变量输出数组的个元素。通过指针变量输出数组的个元素。#include void main()()int*,;,;for(;(;)scanf(,);,);printf(););for(;,(;,)printf(,*););程序运行情况:程序运行情况:1 2 3 4
16、 5 6 7 8 9 022153 234 0 0 30036 25202 11631 8259 8237 28483显然输出的数值并不是数组中各元素的值显然输出的数值并不是数组中各元素的值 C语言程序设计#include void main()()int*,;,;for(;)(;)scanf(,);,);printf(););p=a;for(;,(;,)printf(,*););for(;)(;)printf(,*(-)););C语言程序设计小结小结2若有若有 int a5,*p=a;则:则:数组元素的地址的表示方法:数组元素的地址的表示方法:&ai a+i p+i数组元素的表示方法:数组元
17、素的表示方法:ai *(a+i)*(p+i)piC语言程序设计若有若有 int a5,*p=a;int a5,*p=a;则:则:1.p+2.*p+3.*(p+)4.+(*p)若当前若当前p p指向数组指向数组a a中的第中的第i i个元素,则:个元素,则:1.*(p-)2.*(+p)3.*(-p)注:只有当指针变量指向数组元素时,指针自加注:只有当指针变量指向数组元素时,指针自加 和自减才有意义。和自减才有意义。小结小结3C语言程序设计8.3.3 8.3.3 用数组名作函数参数用数组名作函数参数例例8.7 将数组中个整数按相反顺序存放。将数组中个整数按相反顺序存放。C语言程序设计#includ
18、e 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(););C语言程序设计void inv(int 10)/*形参形参x是数组名是数组名*/int temp,;,;for(;(;=4;);)9;temp;temp;运行情况如下:The original array:,The arra
19、y has been inverted:,C语言程序设计对刚才的程序可以作一些改动。将函数对刚才的程序可以作一些改动。将函数inv中的形参中的形参改成指针变量。改成指针变量。C语言程序设计数组名和指针变量作函数参数,实参与形参的对应关数组名和指针变量作函数参数,实参与形参的对应关系有以下种情况:系有以下种情况:(1)形参和实参都用数组名,如:形参和实参都用数组名,如:void main()()void (int,int)int;(,);(,);C语言程序设计(2)实参用数组名,形参用指针变量。如:实参用数组名,形参用指针变量。如:void()()void(int*,int)int ;(,);(
20、,);C语言程序设计(3)实参形参都用指针变量。例如:实参形参都用指针变量。例如:void main()()void(int*,int)int,*p=a;(p,);,);C语言程序设计(4)实参为指针变量,形参为数组名。如:实参为指针变量,形参为数组名。如:void main()()void(int x,int),*p=a;(p,);,);C语言程序设计小结小结4实参类型实参类型对应形参对应形参类型类型传递的传递的信息信息形参的改形参的改变能否影变能否影响实参响实参变量变量(普通变量普通变量数组元素数组元素结构体变量结构体变量)变量变量变量的变量的值值不能不能数组名或数组名或指针变量指针变量数
21、组名或数组名或指针变量指针变量实参数实参数组首元组首元素地址素地址能能单向共享C语言程序设计习题习题8.14 将将n个数按输入顺序的逆序排列,用函数实现个数按输入顺序的逆序排列,用函数实现void main()int i,n,num100;printf(“input n:”);scanf(“%d”,&n);printf(“please input numbers:”);for(i=0;in;i+)scanf(“%d”,&numi);sort(num,n);for(i=0;in;i+)printf(“%d”,numi);#includevoid sort(int*p1,int m)int tem
22、p,*p2,*p3;p2=p1+(m-1)/2;p3=p1+m-1;for(;p1=p2;p1+,p3-)temp=*p1;*p1=*p3;*p3=temp;运行结果:运行结果:input n:10 please numbers:10 9 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 9 10C语言程序设计8.3.4 8.3.4 多维数组与指针多维数组与指针 用指针变量可以指向一维数组中的元素,也可以指向用指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用上,多维数组多维数组中的元素。但在概念上和使用上,多维数组的指针比一维数组的指针要复杂一些。的
23、指针比一维数组的指针要复杂一些。1.1.多维数组元素的地址多维数组元素的地址先回顾一下多维数组的性质先回顾一下多维数组的性质,可以认为二维数组是可以认为二维数组是“数数组的数组组的数组”,例,例:定义定义int a34=1,3,5,7,;C语言程序设计a34a0a1a2a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23其中其中:数组名数组名a代表首元素的地址,代表首元素的地址,现在的首元素现在的首元素不是一个简单的整型元素,而是由不是一个简单的整型元素,而是由4个整型元素构成个整型元素构成的一维数组,所以的一维数组,所以a代表首行的地址,即代表首行的地址
24、,即&a0。a+1代表代表&a1,a+2代表代表&a2而而a0作为一作为一 维数组的名称,它也代表首元素的地址,维数组的名称,它也代表首元素的地址,所以所以a0代表代表&a00 a1代表代表&a10 a2代表代表&a20C语言程序设计1.a01的地址如何表示呢?的地址如何表示呢?已知已知a00的地址为的地址为&a00或者或者a0或者或者*a a01的地址为的地址为&a01或者或者a0+1或者或者*a+12.a01的值如何表示呢?的值如何表示呢?下标表示法为:下标表示法为:a01 指针表示法为:指针表示法为:*(a0+1)或者或者*(*a+1)思考:思考:a11的地址和值分别怎么表示?的地址和值
25、分别怎么表示?a34a0a1a2a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23C语言程序设计表 示 形 式含义地 址a 二维数组名,&a0,即0行首地址2000a0,*(a+0),*a&a00,0行0列元素地址2000a+1,&a11行首地址2008a1,*(a+1)1行0列元素a10的地址2008a1+2,*(a+1)+2,&a121行2列元素a12 的地址2012*(a1+2),*(*(a+1)+2),a121行2列元素a12的值元素值为13C语言程序设计例例8.0 输出二维数组有关的值输出二维数组有关的值(数组起始地址为数组起始地址为2000)
26、#include void main()()int341,3,5,7,9,;,;printf(,*););printf(,0,*();();printf(,0,00););printf(,1,);,);printf(,10,*(+)+););printf(,*();();printf(,);,);printf(,*(*(););C语言程序设计某一次运行结果如下:某一次运行结果如下:2000,2000 (0行首地址和行首地址和0行行0列元素地址列元素地址)2000,2000 (0行行0列元素地址列元素地址)2000,2000 (0行行0列首地址和列首地址和0行行0列元素地址列元素地址)2016,
27、2016 (1行行0列元素地址和列元素地址和1行首地址行首地址)2016,2016 (1行行0列元素地址列元素地址)2032,2032 (2行行0列元素地址列元素地址)2032,2032 (2行首地址行首地址),(1行行0列元素的值列元素的值)C语言程序设计2.2.指向多维数组元素的指针变量指向多维数组元素的指针变量(1)指向数组元素的指针变量指向数组元素的指针变量例例8.11 8.11 用指针变量输出二维数组元素的值用指针变量输出二维数组元素的值#include void main()()int 341,3,5,7,9,11,13,15,17,19,21,23;int *;for(;)(;)
28、printf(,*););运行结果如下:1 2 5 7 9 11 13 15 17 19 21 23C语言程序设计(2)指向由个元素组成的一维数组的指针变量指向由个元素组成的一维数组的指针变量例例8.12 8.12 输出二维数组任一行任一列元素的值输出二维数组任一行任一列元素的值#include void main()int 1,3,5,7,9,11,13,15,;,;int(*p)4,,;,;scanf(,);,);printf(,*(*();();运行情况如下:运行情况如下:,(本行为键盘输入)(本行为键盘输入)12C语言程序设计小结小结5指针变量指向多维数组:指针变量指向多维数组:1.1
29、.用指针变量指向数组元素用指针变量指向数组元素 int a34,*p;int a34,*p;p=a0;p=a0;数组元素数组元素aijaij的地址用如下方式表示:的地址用如下方式表示:&aij ai+j *(a+i)+j&aij ai+j *(a+i)+j2.2.用行指针指向数组中每一行用行指针指向数组中每一行 int a34,(*p)4;int a34,(*p)4;p=a;p=a;C语言程序设计 8.4 8.4 字符串与指针字符串与指针8.4.8.4.字符串的表示形式字符串的表示形式#include void main()()char stringI love China!;printf(,
30、string););(1)用字符数组存放一个字符串,然后输出该字符串。用字符数组存放一个字符串,然后输出该字符串。C语言程序设计(2)用字符指针指向一个字符串。用字符指针指向一个字符串。可以不定义字符数组,而定义一个字符指针。用字符可以不定义字符数组,而定义一个字符指针。用字符指针指向字符串中的字符。指针指向字符串中的字符。#include void main()()char*string I love China!;printf(,);,);IloveChina!0stringC语言程序设计例例10.10.3 3 将字符串复制给字符串。将字符串复制给字符串。#include void()()
31、char am a boy,20;int;for(;(;*()!()!;);)*()()*();();*()();printf(string a is:%sn,a););printf(string b is:%sn,b););C语言程序设计(1)用字符数组作参数用字符数组作参数10.4.2 10.4.2 字符指针作函数参数字符指针作函数参数例例10.19 用函数调用实现字符串的复制用函数调用实现字符串的复制#include void copy_string(char from,char to)int;while(fromi!=0)toi=fromi;i+;toi=0;void main()()
32、char a=am a teacher;char b=you are a student;printf(“string a=n string b=n,a,b);printf(“copy string a to string b:n”);copy_string(a,b);printf(n string a=%sn string b=%sn,a,b);程序运行结果如下程序运行结果如下:string aI am a teacher string b you are a student copy string a to string b:string a I am a teacherstringI a
33、m a teacherC语言程序设计(2)实参、形参用字符指针变量实参、形参用字符指针变量#include void main()()void copy_string(char *from,char *to);char*am a teacher.;char*you are a student;printf(string a=sn string sn,a,b);printf(copy string a to string b:n);copy_string(a,b);printf(“n string a=%sn string b=%sn,a,b);C语言程序设计void copy_string(char*from,char*to)for(;(;*from!=0;from+,to+)*to=*from;*to=0;C语言程序设计小结小结6字符指针变量指向字符串:字符指针变量指向字符串:1.1.如何让一个字符指针变量指向一个字符串如何让一个字符指针变量指向一个字符串 char*p=char*p=“I love China!I love China!”;2.2.字符指针变量和字符数组区别字符指针变量和字符数组区别 char char*p=“I love China!”;char p=“I love China!”;3.3.字符指针变量和字符数组名作函数参数字符指针变量和字符数组名作函数参数