版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、主讲主讲:吕元长吕元长l 地址和指针的概念地址和指针的概念 凡存放在内存中的程序和数据都有一个地址。一个变量的地址称为该变量的指针。凡存放在内存中的程序和数据都有一个地址。一个变量的地址称为该变量的指针。 用来存放一个变量地址的变量称为指针变量。用来存放一个变量地址的变量称为指针变量。附注:附注:变量的变量的“直接引用直接引用”方式:通过变量名来直接引用变量。方式:通过变量名来直接引用变量。 变量的变量的“间接引用间接引用”方式:将变量的地址存放在一个指针变量中,然后通过存放变量地址的指针变量来引用变方式:将变量的地址存放在一个指针变量中,然后通过存放变量地址的指针变量来引用变量量第第7 7章
2、章 指针指针变量变量地址地址内容内容int x;int x;x = 3; printf(“%d”, x);x = 3; printf(“%d”, x);x20013px30002001直接访问:直接访问:通过变量名直接访问地址通过变量名直接访问地址间接访问:间接访问:把变量的地址放到另一变量中,使用时先找到后把变量的地址放到另一变量中,使用时先找到后者的地址,从中取出前者的地址者的地址,从中取出前者的地址指针变量指针变量地地址址另一变量的地址另一变量的地址主讲主讲:吕元长吕元长l 地址和指针的概念地址和指针的概念 凡存放在内存中的程序和数据都有一个地址。一个变量的地址称为该变量的指针。凡存放在
3、内存中的程序和数据都有一个地址。一个变量的地址称为该变量的指针。 用来存放一个变量地址的变量称为指针变量。用来存放一个变量地址的变量称为指针变量。附注:附注:变量的变量的“直接引用直接引用”方式:通过变量名来直接引用变量。方式:通过变量名来直接引用变量。 变量的变量的“间接引用间接引用”方式:将变量的地址存放在一个指针变量中,然后通过存放变量地址的指针变量来引用变方式:将变量的地址存放在一个指针变量中,然后通过存放变量地址的指针变量来引用变量量变量变量地址地址内容内容int x;int x;x = 3; printf(“%d”, x);x = 3; printf(“%d”, x);x20013
4、px30002001指针变量:存放地址的变量指针变量:存放地址的变量指针变量指针变量地地址址另一变量的地址另一变量的地址某个变量的地址某个变量的地址指向指向指向指向主讲主讲:吕元长吕元长* 指针运算符指针运算符(间接访问运算符间接访问运算符) int *p, a = 3; p&a; 把把 a 的地址赋给的地址赋给 p,即即 p 指向指向 al 指针变量的定义:指针变量的定义: 类型名类型名 * *指针变量名;指针变量名; 附注:附注: 变量名前面的变量名前面的“ “ * * ” ”是一个说明符,用来说明该变量是指针变量,这个是一个说明符,用来说明该变量是指针变量,这个“ “ * * ”
5、 ”是不能省略的,但是是不能省略的,但是它不是变量名的一部分。它不是变量名的一部分。 类型名表示指针变量所指向的变量的类型,而且只能指向这种类型的变量。类型名表示指针变量所指向的变量的类型,而且只能指向这种类型的变量。 指针变量可以进行初始化。指针变量可以进行初始化。 l 指针变量的赋值指针变量的赋值方法一:使用取地址运算符方法一:使用取地址运算符& &。指针变量名。指针变量名=&=&变量名;例如:变量名;例如:int int * *p p,a a; p=&ap=&a;方法二:利用同类型指针变量赋值。例如:方法二:利用同类型指针变量赋值。例如:i
6、nt int * *p p,* *q q,a a; p=&ap=&a;q=pq=p;方法三:给指针变量赋空值(方法三:给指针变量赋空值(NULLNULL)。例如:)。例如:int int * *p p;p= NULLp= NULL;(;(NULLNULL在头文件在头文件stdio.hstdio.h中已经定义为符中已经定义为符号常量,等于整数号常量,等于整数0 0)。)。 附注:附注: 取地址运算符取地址运算符& &的运算对象必须是一个变量。当一个变量的地址赋给指针变量时,该变量的类型必须与的运算对象必须是一个变量。当一个变量的地址赋给指针变量时,该变量的类型必须
7、与指针变量指向类型一致。指针变量指向类型一致。 指针变量是用来存放地址的,不要给指针变量赋常数值。指针变量是用来存放地址的,不要给指针变量赋常数值。 指针变量没有指向确定地址前,不要对他所指的对象赋值。例如:指针变量没有指向确定地址前,不要对他所指的对象赋值。例如:int int * *p p;指针变量;指针变量p p没有指向确定地址前,没有指向确定地址前,赋值语句赋值语句scanf(“%d”, p)scanf(“%d”, p);或;或* *p=3p=3;都是错误的。;都是错误的。 a3&ap*p*p表示表示p所指向的变量所指向的变量 al 指针的间接引用指针的间接引用 /* 程序程序
8、L7_1.C功能:通过两种方式引用变量功能:通过两种方式引用变量 */#include void main() int a, b; int *p; / /* * 定义指针变量定义指针变量p p * */ / p = &b; / /* * 将变量将变量b b的地址存放在变量的地址存放在变量p p中中 * */ / a = 3; / /* * 直接引用变量直接引用变量a a * */ / *p = 5; / /* * 间接引用变量间接引用变量b b * */ / printf( a = %d, b = %dn, a, b );运行结果:运行结果:a = 3, b = 5主讲主讲:吕元长吕元
9、长/ /* * 程序程序L7_2.C L7_2.C * */ /#include#includevoid main( )void main( ) int a = 3, int a = 3, * *p; p; p = &a; p = &a; printf(“%d,%dn”, a, printf(“%d,%dn”, a, * *p);p); scanf(“%d”, &a); scanf(“%d”, &a); printf(“%d,%dn”, a, printf(“%d,%dn”, a, * *p);p); scanf(“%d”, p); scanf(“%d”, p)
10、; printf(“%d,%dn”, a, printf(“%d,%dn”, a, * *p);p); * *p = 10;p = 10; printf(“%d,%dn”, a, printf(“%d,%dn”, a, * *p);p); l 指针变量的运算指针变量的运算指针变量通过指针运算符指针变量通过指针运算符* *引用它所指向的存储单元的值。例如:若有赋值语句引用它所指向的存储单元的值。例如:若有赋值语句 p=&ap=&a;,则;,则 * *p p等于等于a a、p p等于等于&a&a。附注:附注: 运算符运算符& &和和* *都是单目运算
11、符,优先级为都是单目运算符,优先级为2 2级,结合方向为从右至左。级,结合方向为从右至左。 指针运算符指针运算符* *的运算对象只能是指针或地址。的运算对象只能是指针或地址。 指针变量可以做加减整数运算、自增自减运算(移动操作),同类型的指针变量可以做比较运算、赋值运算指针变量可以做加减整数运算、自增自减运算(移动操作),同类型的指针变量可以做比较运算、赋值运算和减法运算。和减法运算。 a3&ap*p输入输入 5 75, 53, 37, 710, 10主讲主讲:吕元长吕元长/ /* * 程序程序L7_3.C L7_3.C * */ /#include#includevoid main(
12、 )void main( ) int a, b; int a, b; int int * *p1, p1, * *p2;p2; a = 100; b = 10; a = 100; b = 10; p1 = &a; p1 = &a; p2 = &b; p2 = &b; printf(“%d, %dn”, a, b); printf(“%d, %dn”, a, b); printf(“%d, %dn”, printf(“%d, %dn”, * *p1, p1, * *p2);p2); l 指针变量的运算指针变量的运算指针变量通过指针运算符指针变量通过指针运算符* *
13、引用它所指向的存储单元的值。例如:若有赋值语句引用它所指向的存储单元的值。例如:若有赋值语句 p=&ap=&a;,则;,则 * *p p等于等于a a、p p等于等于&a&a。附注:附注: 运算符运算符& &和和* *都是单目运算符,优先级为都是单目运算符,优先级为2 2级,结合方向为从右至左。级,结合方向为从右至左。 指针运算符指针运算符* *的运算对象只能是指针或地址。的运算对象只能是指针或地址。 指针变量可以做加减整数运算、自增自减运算(移动操作),同类型的指针变量可以做比较运算、赋值运算指针变量可以做加减整数运算、自增自减运算(移动操作)
14、,同类型的指针变量可以做比较运算、赋值运算和减法运算。和减法运算。 a100&ap1*p1b10&bp2*p2100, 10100, 10指针运算注意事项:指针运算注意事项: 当当 p p&a &a 后,后,* *p p 与与 a a 相同。相同。 int int * *p p; 定义定义 * *p =10p =10; p p所指向的变量所指向的变量 & &* *p p 与与 &a &a 相同,是地址相同,是地址 * *&a &a 与与 a a 相同,是变量相同,是变量 ( (* *p)+ p)+ 等价于等价于 a
15、+ a+ 将将p p所指向的变量值加所指向的变量值加1 1 * *p+ p+ 等价于等价于 * *(p+)(p+) 先取先取 * *p p,然后,然后 p p 自加,此时自加,此时p p不再指向不再指向a a主讲主讲:吕元长吕元长l 指针变量作函数参数指针变量作函数参数 当指针变量作函数参数,其作用是将一个变量的地址传送到另一个函数中。此时形参从实参获得了变量的地址,当指针变量作函数参数,其作用是将一个变量的地址传送到另一个函数中。此时形参从实参获得了变量的地址,即形参和实参指向同一个变量,当形参指向的变量发生变化时,实参指向的变量也随之变化。即形参和实参指向同一个变量,当形参指向的变量发生变
16、化时,实参指向的变量也随之变化。 附注:通过指针变量作函数参数,无需返回值和全局变量,主调函数就可以使用被调用函数改变的值。但是如果附注:通过指针变量作函数参数,无需返回值和全局变量,主调函数就可以使用被调用函数改变的值。但是如果改变的不是指针形参指向变量的值,只是改变指针形参的值,效果是不一样的。改变的不是指针形参指向变量的值,只是改变指针形参的值,效果是不一样的。/ /* * 程序程序L7_4.C L7_4.C * */ /#include#includeswap1(int x, int y)swap1(int x, int y) int t; int t; t = x; t = x; x
17、 = y; x = y; y = t; y = t; void main()void main() int a=3, b=5; int a=3, b=5; swap1(a, b); swap1(a, b); printf(“%d, %dn”, a, b); printf(“%d, %dn”, a, b); 3, 5a35bx35yx53y5, 335abp1p253值值(地址地址)传递,地址未变,传递,地址未变,但存放的变量的值改变了。但存放的变量的值改变了。swap2(int swap2(int * *p1, int p1, int * *p2)p2) int t; int t; t = t
18、 = * *p1; p1; * *p1 = p1 = * *p2; p2; * *p2 = t;p2 = t; void main()void main() int a=3, b=5; int a=3, b=5; swap2(&a, &b); swap2(&a, &b); printf(“%d, %dn”, a, b); printf(“%d, %dn”, a, b); / /* * 程序程序L7_5.C L7_5.C * */ /#include#include/ /* * 程序程序L7_6.C L7_6.C * */ /#includeswap3(int *
19、p1, int *p2) int *p; p = p1; p1 = p2; p2 = p;void main( ) int a=3, b=5; swap2(&a, &b); printf(“%d, %dn”, a, b);35abp1p2值值(地址地址)传递,形参指针的改变传递,形参指针的改变不会影响实参不会影响实参3, 5主讲主讲:吕元长吕元长/ /* * 程序程序L7_5.C L7_5.C 实验实验8 8指针指针_3_3:想使指针变量:想使指针变量pt1pt1指向指向a a和和b b中的大者,中的大者,pt2pt2指向小者,指向小者,以下程序能否实现此目的?以下程序能否实现
20、此目的? * */ /l 指针变量作函数参数指针变量作函数参数 当指针变量作函数参数,其作用是将一个变量的地址传送到另一个函数中。此时形参从实参获得了变量的地址,当指针变量作函数参数,其作用是将一个变量的地址传送到另一个函数中。此时形参从实参获得了变量的地址,即形参和实参指向同一个变量,当形参指向的变量发生变化时,实参指向的变量也随之变化。即形参和实参指向同一个变量,当形参指向的变量发生变化时,实参指向的变量也随之变化。 附注:通过指针变量作函数参数,无需返回值和全局变量,主调函数就可以使用被调用函数改变的值。但是如果附注:通过指针变量作函数参数,无需返回值和全局变量,主调函数就可以使用被调用
21、函数改变的值。但是如果改变的不是指针形参指向变量的值,只是改变指针形参的值,效果是不一样的。改变的不是指针形参指向变量的值,只是改变指针形参的值,效果是不一样的。swap(int *p1,int *p2) 值值(地址地址)传递,形参指针的改变不会影响实参传递,形参指针的改变不会影响实参 main() int a, b; int *pt1, *pt2; scanf(%d,%d, &a, &b); 分析:假设输入分析:假设输入 1 1,3 31 13 31000100010021002p1p1p2p21000100010021002p p1000100010021002100010
22、00pt1=&a; pt2=&b;if(ab) swap(pt1,pt2);printf(%d,%dn, *pt1, *pt2);int *p;p=p1; p1=p2; p2=p;a ab b1000100010021002pt1pt1pt2pt2主讲主讲:吕元长吕元长/ /* * 程序程序L7_5.C L7_5.C 实验实验8 8指针指针_3_3:想使指针变量:想使指针变量pt1pt1指向指向a a和和b b中的大者,中的大者,pt2pt2指向小者,指向小者,以下程序能否实现此目的?以下程序能否实现此目的? * */ /l 指针变量作函数参数指针变量作函数参数 当指针变量作函
23、数参数,其作用是将一个变量的地址传送到另一个函数中。此时形参从实参获得了变量的地址,当指针变量作函数参数,其作用是将一个变量的地址传送到另一个函数中。此时形参从实参获得了变量的地址,即形参和实参指向同一个变量,当形参指向的变量发生变化时,实参指向的变量也随之变化。即形参和实参指向同一个变量,当形参指向的变量发生变化时,实参指向的变量也随之变化。 附注:通过指针变量作函数参数,无需返回值和全局变量,主调函数就可以使用被调用函数改变的值。但是如果附注:通过指针变量作函数参数,无需返回值和全局变量,主调函数就可以使用被调用函数改变的值。但是如果改变的不是指针形参指向变量的值,只是改变指针形参的值,效
24、果是不一样的。改变的不是指针形参指向变量的值,只是改变指针形参的值,效果是不一样的。main() int a,b; int *pt1, *pt2; scanf(%d, %d, &a, &b); swap(int swap(int * *p1,int p1,int * *p2)p2) pt1=&a; pt2=&b;if(ab) swap(pt1, pt2);printf(%d,%dn, *pt1, *pt2);int int * *p;p; p=p1;p=p1; p1=p2;p1=p2; p2=p;p2=p;#include stdio.hswap(int *p1
25、, int *p2) p1p1p2p21000100010021002p p1 11 13 3int p;p=*p1; *p1=*p2; *p2=p;3 31 11000100010021002分析:假设输入分析:假设输入 1 1,3 3a ab b1000100010021002pt1pt1pt2pt2值值(地址地址)传递,地址未变,传递,地址未变,但存放的变量的值改变了但存放的变量的值改变了要使某个变量的值通过函数调用发生改变要使某个变量的值通过函数调用发生改变(1) (1) 在主调函数中,把该变量的地址作为实参在主调函数中,把该变量的地址作为实参(2) (2) 在被调函数中,用形参(指针
26、)接受地址在被调函数中,用形参(指针)接受地址(3) (3) 在被调函数中,改变形参(指针)所指向变量的值在被调函数中,改变形参(指针)所指向变量的值主讲主讲:吕元长吕元长l 指针变量作函数参数指针变量作函数参数 当指针变量作函数参数,其作用是将一个变量的地址传送到另一个函数中。此时形参从实参获得了变量的地址,当指针变量作函数参数,其作用是将一个变量的地址传送到另一个函数中。此时形参从实参获得了变量的地址,即形参和实参指向同一个变量,当形参指向的变量发生变化时,实参指向的变量也随之变化。即形参和实参指向同一个变量,当形参指向的变量发生变化时,实参指向的变量也随之变化。 附注:通过指针变量作函数
27、参数,无需返回值和全局变量,主调函数就可以使用被调用函数改变的值。但是如果附注:通过指针变量作函数参数,无需返回值和全局变量,主调函数就可以使用被调用函数改变的值。但是如果改变的不是指针形参指向变量的值,只是改变指针形参的值,效果是不一样的。改变的不是指针形参指向变量的值,只是改变指针形参的值,效果是不一样的。例例L7_6L7_6( (实验实验8 8指针指针_2)_2)1217151311ns函数函数void fun(fioat void fun(fioat * *sn,int n)sn,int n)的功能是的功能是:根据以下公式计算根据以下公式计算s s,计算结果通计算结果通过形参指针过形参
28、指针 sn sn 传回传回;n n 通过形参传入通过形参传入,n n 的值大于等于的值大于等于 0 0 。请填空请填空。main() float s; int n; printf(n=); scanf(%d,&n); fun(&s,n); printf(s=%fn,s);void fun(float *sn,int n) float s=0.0,w,f=-1.0; int i=0; for (i=0;i=n;i+); f= * f; w=f/(2*i+1); s+=w; =s;-1*sn i i=n f w 1 1/11 1/1-1 -1/3-1 -1/31 1/51 1/5-
29、1 -1/7-1 -1/7 0 0 真真1 1 真真2 2 真真3 3 真真改变形参(指针)所指向变量的值改变形参(指针)所指向变量的值去掉分号去掉分号主讲主讲:吕元长吕元长/ /* * 程序程序L7_9.CL7_9.C:实验:实验8 8指针指针_1 _1 * */ /#include #include void main()void main()#include stdio.h#include stdio.hmain()main() int a5, int a5,* *p,j;p,j; for(j=0;j5;j+) aj=j+1; for(j=0;j5;j+) aj=j+1; p=a; p=
30、a; for(j=0;j5;j+) for(j=0;j5;j+) printf( printf(* *(p+%d)=%dn,j,(p+%d)=%dn,j,* *(p+j);(p+j); / /* *程序程序L7_8.CL7_8.C:指针变量自身值改变,输出数组中:指针变量自身值改变,输出数组中的全部元素的全部元素* */ /#include #include void main()void main() int int * *p,i;p,i; int a5=1,2,3,4,5; int a5=1,2,3,4,5; p=a; p=a; printf(n); printf(n); for (;pa
31、+5;p+) printf(%dt, for (;pa+5;p+) printf(%dt,* *p);p); l 指针与一维数组指针与一维数组 指针变量可以指向数组,也可以指向数组元素。其中指向数组的指针是数组的首地址,指向数组元素的指针则指针变量可以指向数组,也可以指向数组元素。其中指向数组的指针是数组的首地址,指向数组元素的指针则是数组元素的地址。是数组元素的地址。 附注:附注: 数组名是数组的首地址,可以做加整数数组名是数组的首地址,可以做加整数i i的运算,表示下标为的运算,表示下标为i i的数组元素的地址。例如:已知的数组元素的地址。例如:已知int int a10a10;则;则a
32、a与与&a0&a0等价、等价、a+ia+i等价于等价于&ai&ai。 当指向数组元素的指针变量当指向数组元素的指针变量p p等于数组名时,等于数组名时,p+ip+i与与a+ia+i都指向数组元素都指向数组元素aiai,但是作为指针变量的,但是作为指针变量的p p可以实现自可以实现自身值的改变,如身值的改变,如p+p+,而数组名,而数组名a a是一个代表数组首地址的常量,它的值是不能改变的,即是一个代表数组首地址的常量,它的值是不能改变的,即a+a+是不合法的。是不合法的。 指向数组元素的指针做加减运算或自增自减运算时需要注意:对于不同类型的数组,实际指向数组元素
33、的指针做加减运算或自增自减运算时需要注意:对于不同类型的数组,实际p p值的改变是不同的。值的改变是不同的。如果数组元素为如果数组元素为intint型型,p+1,p+1就意味着就意味着p p的值加上的值加上2 2,这才能指向数组的下一个元素。因此,这才能指向数组的下一个元素。因此p+1p+1代表的地址是代表的地址是p+1p+1d d,d d是一个数组元素所占用的字节数。是一个数组元素所占用的字节数。 / /* * 程序程序L7_7.CL7_7.C功能:输出数组中的全部元素功能:输出数组中的全部元素 * */ /#include #include void main()void main() i
34、nt int * *p,i;p,i; int a5=1,2,3,4,5; int a5=1,2,3,4,5; p=a; p=a; for (i=0;i5;i+) for (i=0;i5;i+) printf(%dt ,ai); printf(%dt ,ai); printf(n); printf(n); for (i=0;i5;i+) for (i=0;i5;i+) printf(%dt , printf(%dt ,* *(p+i);(p+i); 1 2 3 4 5 1 2 3 4 5 运行结果:运行结果: 1 2 3 4 5 pj可改为可改为主讲主讲:吕元长吕元长l 指向数组元素的指针变量作
35、函数参数指向数组元素的指针变量作函数参数 当一个指针变量指向数组的第一个元素或者等于数组名时,数组名和指针变量的含义相同,都表示数组的首当一个指针变量指向数组的第一个元素或者等于数组名时,数组名和指针变量的含义相同,都表示数组的首地址。所以在函数中地址的传递也可以使用指向数组首地址的指针变量,即实参和形参使用数组名时可以使地址。所以在函数中地址的传递也可以使用指向数组首地址的指针变量,即实参和形参使用数组名时可以使用指针变量替换。这样实参和形参可以是以下四种情况之一。用指针变量替换。这样实参和形参可以是以下四种情况之一。 实参:数组名实参:数组名 数组名数组名 指针变量指针变量 指针变量指针变
36、量 形参:数组名形参:数组名 指针变量指针变量 数组名数组名 指针变量指针变量 一个指针变量可以指向数组的任何一个元素,此时指向该数组元素的指针变量同样可以作函数参数,传递的一个指针变量可以指向数组的任何一个元素,此时指向该数组元素的指针变量同样可以作函数参数,传递的是指向的数组元素的地址。是指向的数组元素的地址。附注:指向数组的任何一个元素的指针变量或数组名以及数组元素地址作为参数传递时,形参为指针变量或数组,附注:指向数组的任何一个元素的指针变量或数组名以及数组元素地址作为参数传递时,形参为指针变量或数组,属于地址传递。属于地址传递。 / /* *程序程序L7_10.C L7_10.C 已
37、知一个一维数组已知一个一维数组a11a11中有中有1010个数,个数,求出其中前求出其中前n n个数的和并放入个数的和并放入a10a10中。其中中。其中n n由键盘由键盘输入。输入。* */ /#include #include void sum(int void sum(int * *q,int n)q,int n) int i,s=0, int i,s=0,* *t;t; t=q; / t=q; /* * t t与与q q都指向数组都指向数组a a的第一个元素的第一个元素 * */ / for (i=0;in;i+,q+) for (i=0;in;i+,q+) s+= s+=* *q;q;
38、 * *(t+10)=s; /(t+10)=s; /* * t+10 t+10指向数组元素指向数组元素a10 a10 * */ / void main()void main() int num, a11=1,2,3,4,5,6,7,8,9,10, int num, a11=1,2,3,4,5,6,7,8,9,10, * *p=a;p=a; scanf (%d,&num); scanf (%d,&num); sum(p,num); sum(p,num); printf(%dn,a10); printf(%dn,a10); / /* *程序程序L7_11.CL7_11.C已知一个一
39、维数组已知一个一维数组a10a10中有中有1010个数,个数,求出第求出第m m个数到第个数到第n n个数的和。个数的和。 其中其中m m、n n由键盘输入由键盘输入* */ /#include #include int sum(int int sum(int * *q,int n)q,int n) int i,s=0; int i,s=0; for (i=0;in;i+,q+) for (i=0;in;i+,q+) s+= s+=* *q;q; return s; return s; void main()void main() int m,n, a10=1,2,3,4,5,6,7,8,9,
40、10; int m,n, a10=1,2,3,4,5,6,7,8,9,10; int int * *p;p; printf(Please input m and n (mn10) :n); printf(Please input m and n (mn10) :n); scanf (%d,%d,&m,&n); scanf (%d,%d,&m,&n); p=a+m-1; / p=a+m-1; /* * 数组下标从数组下标从0 0开始,所以第开始,所以第m m个元素个元素 下标为下标为m-1m-1,地址为,地址为a+m-1 a+m-1 * */ / printf(%
41、dn, sum(p,n-m+1); printf(%dn, sum(p,n-m+1); / /* * 若计算第若计算第3 3个到第个到第5 5个数的和,实际计算的个数的和,实际计算的 是第是第3 3、4 4、5 5共共5-3+15-3+1个数的和个数的和 * */ / 4 101, 4 10主讲主讲:吕元长吕元长l 指向数组元素的指针变量作函数参数指向数组元素的指针变量作函数参数 当一个指针变量指向数组的第一个元素或者等于数组名时,数组名和指针变量的含义相同,都表示数组的首当一个指针变量指向数组的第一个元素或者等于数组名时,数组名和指针变量的含义相同,都表示数组的首地址。所以在函数中地址的传递
42、也可以使用指向数组首地址的指针变量,即实参和形参使用数组名时可以使地址。所以在函数中地址的传递也可以使用指向数组首地址的指针变量,即实参和形参使用数组名时可以使用指针变量替换。这样实参和形参可以是以下四种情况之一。用指针变量替换。这样实参和形参可以是以下四种情况之一。 实参:数组名实参:数组名 数组名数组名 指针变量指针变量 指针变量指针变量 形参:数组名形参:数组名 指针变量指针变量 数组名数组名 指针变量指针变量 一个指针变量可以指向数组的任何一个元素,此时指向该数组元素的指针变量同样可以作函数参数,传递的一个指针变量可以指向数组的任何一个元素,此时指向该数组元素的指针变量同样可以作函数参
43、数,传递的是指向的数组元素的地址。是指向的数组元素的地址。附注:指向数组的任何一个元素的指针变量或数组名以及数组元素地址作为参数传递时,形参为指针变量或数组,附注:指向数组的任何一个元素的指针变量或数组名以及数组元素地址作为参数传递时,形参为指针变量或数组,属于地址传递。属于地址传递。 / /* * 程序程序L7_12.C L7_12.C 实验实验8 8指针思考题第指针思考题第2 2题:题:用指针的方法对用指针的方法对n n个整数排序并输出。个整数排序并输出。 要求将排序单独写一个函数。要求将排序单独写一个函数。n n 和各个整数在主函数中输入,最后在主函数中输出。和各个整数在主函数中输入,最
44、后在主函数中输出。 * */ /#include #include #define N 10#define N 10Void sort(int Void sort(int * *p,int n)p,int n) int i,j,k,t; int i,j,k,t; for(i=0;in-1;i+) for(i=0;in-1;i+) k=i; k=i; for(j=i+1;jn;j+) for(j=i+1;jn;j+) if( if(* *(p+j)(p+j)* *(p+k) k=j;(p+k) k=j; t= t=* *(p+k); (p+k); * *(p+k)=(p+k)=* *(p+i);
45、 (p+i); * *(p+i)=t;(p+i)=t; void main()void main() int aN,i; int aN,i; printf(Input array a:n); printf(Input array a:n); for(i=0;iN;i+) scanf(%d,a+i); for(i=0;iN;i+) scanf(%d,a+i); sort(a,N); sort(a,N); printf(Output the sorted array:n); printf(Output the sorted array:n); for(i=0;iN;i+) printf(%d ,
46、for(i=0;iN;i+) printf(%d ,* *(a+i);(a+i); printf(n); printf(n); 主讲主讲:吕元长吕元长l 指针与二维数组(教材指针与二维数组(教材p135p135)二维数组元素的的表示法有以下四种:二维数组元素的的表示法有以下四种: 数组下标法:数组下标法:aijaij。 指针表示法:指针表示法:* *( (* *(a+i)+j)(a+i)+j)。 行数组下标法:行数组下标法:* *(ai+j)(ai+j)。 列数组下标法:列数组下标法:( (* *(a+i)j(a+i)j。/ /* * 程序程序L7_13.C L7_13.C 实验实验8 8指针
47、思考题第指针思考题第1 1题:题:编写一个函数实现将一个编写一个函数实现将一个3 33 3的矩阵转置。的矩阵转置。 分析说明:在主函数中用分析说明:在主函数中用 scanfscanf输入矩阵元素,将数组名作为函数参数,在执行函数的过程中实现矩阵转输入矩阵元素,将数组名作为函数参数,在执行函数的过程中实现矩阵转置,函数调用结束后在主函数中输出已转置的矩阵。置,函数调用结束后在主函数中输出已转置的矩阵。#include stdio.h#include stdio.hvoid tranf(int void tranf(int ( (* *p)3p)3) ) int t,i,j; int t,i,j;
48、 for(i=0;i3;i+)for(i=0;i3;i+) for(j=0;ji;j+) for(j=0;ji;j+) t= t=* *( (* *(p+i)+j); (p+i)+j); * *( (* *(p+i)+j)=(p+i)+j)=* *( (* *(p+j)+i);(p+j)+i); * *( (* *(p+j)+i)=t;(p+j)+i)=t; voidvoid main()main() int i,j,a33; int i,j,a33; for(i=0;i3;i+) for(i=0;i3;i+) for(j=0;j3;j+) for(j=0;j3;j+) scanf(%d,&a
49、mp;aij); scanf(%d,&aij); tranf(a);tranf(a); for(i=0;i3;i+) for(i=0;i3;i+) for(j=0;j3;j+) for(j=0;j3;j+) printf(%3d,aij); printf(%3d,aij); printf(n); printf(n); 主讲主讲:吕元长吕元长l 指针与字符串指针与字符串 C C语言中,字符串是通过一维字符数组来存储的。因此,可以使用指向字符数组的指针变量来实现字符串的操语言中,字符串是通过一维字符数组来存储的。因此,可以使用指向字符数组的指针变量来实现字符串的操作。例如:作。例如:cha
50、r char * *str=“Hello”str=“Hello”; 。 附注:附注: 一个指向字符型的指针变量可以说明一个字符串,它指向某一个字符,表示的是指针位置开始的一个字一个指向字符型的指针变量可以说明一个字符串,它指向某一个字符,表示的是指针位置开始的一个字符串,它可以做加减整数运算、自增自减运算(指针指向字符串起始位置移动),指向同一个字符串的指符串,它可以做加减整数运算、自增自减运算(指针指向字符串起始位置移动),指向同一个字符串的指针可以做减法运算。针可以做减法运算。 不能通过赋值运算将一个字符串赋给字符数组名,但是可以赋给一个字符型指针变量,此时该指针变量指向的不能通过赋值运算
51、将一个字符串赋给字符数组名,但是可以赋给一个字符型指针变量,此时该指针变量指向的是字符串的第一个字符。是字符串的第一个字符。 指向字符串的指针变量的用法要符合指向一维数组的指针变量的用法。指向字符串的指针变量的用法要符合指向一维数组的指针变量的用法。 将字符串作为函数参数传递,可以使用字符数组名(或数组元素地址)作参数,也可以使用指向字符串的指针将字符串作为函数参数传递,可以使用字符数组名(或数组元素地址)作参数,也可以使用指向字符串的指针变量作参数,此时属于地址传递情况,形参的改变会影响实参。实参和形参的对应情况也有四种。变量作参数,此时属于地址传递情况,形参的改变会影响实参。实参和形参的对
52、应情况也有四种。 实参:数组名实参:数组名 数组名数组名 指针变量指针变量 指针变量指针变量 形参:数组名形参:数组名 指针变量指针变量 数组名数组名 指针变量指针变量 / /* * 程序程序L7_14.C L7_14.C 功能:用指针变量输出字符串功能:用指针变量输出字符串 * */ /#include #include void main()void main() char char * *string=Hello;string=Hello; printf(%sn , string); printf(%sn , string); 运行结果:运行结果:HelloHello/ /* * 程序程
53、序L7_15.C L7_15.C 程序功能:将字符串程序功能:将字符串str2str2复制连接到复制连接到str1 str1 * */ /#include #include void main()void main() char char * *s1 , s1 , * *s2 , s2 , str130=Beijing ,str210=China;str130=Beijing ,str210=China; for (s1=str1; for (s1=str1;* *s1!=0;s1+);s1!=0;s1+); for (s2=str2; for (s2=str2;* *s2!=0;)s2!=0
54、;) * *s1+=s1+=* *s2+;s2+; * *s1=0;s1=0; printf(%sn, str1); printf(%sn, str1); 运行结果:运行结果:BeijingChinaBeijingChina阅读教材阅读教材P137-P139P137-P139:例例7.137.13、例、例7.147.14、例、例7.157.15主讲主讲:吕元长吕元长l 指针与字符串指针与字符串 C C语言中,字符串是通过一维字符数组来存储的。因此,可以使用指向字符数组的指针变量来实现字符串的操语言中,字符串是通过一维字符数组来存储的。因此,可以使用指向字符数组的指针变量来实现字符串的操作。例如
55、:作。例如:char char * *str=“Hello”str=“Hello”; 。 附注:附注: 一个指向字符型的指针变量可以说明一个字符串,它指向某一个字符,表示的是指针位置开始的一个字一个指向字符型的指针变量可以说明一个字符串,它指向某一个字符,表示的是指针位置开始的一个字符串,它可以做加减整数运算、自增自减运算(指针指向字符串起始位置移动),指向同一个字符串的指符串,它可以做加减整数运算、自增自减运算(指针指向字符串起始位置移动),指向同一个字符串的指针可以做减法运算。针可以做减法运算。 不能通过赋值运算将一个字符串赋给字符数组名,但是可以赋给一个字符型指针变量,此时该指针变量指向
56、的不能通过赋值运算将一个字符串赋给字符数组名,但是可以赋给一个字符型指针变量,此时该指针变量指向的是字符串的第一个字符。是字符串的第一个字符。 指向字符串的指针变量的用法要符合指向一维数组的指针变量的用法。指向字符串的指针变量的用法要符合指向一维数组的指针变量的用法。 将字符串作为函数参数传递,可以使用字符数组名(或数组元素地址)作参数,也可以使用指向字符串的指针将字符串作为函数参数传递,可以使用字符数组名(或数组元素地址)作参数,也可以使用指向字符串的指针变量作参数,此时属于地址传递情况,形参的改变会影响实参。实参和形参的对应情况也有四种。变量作参数,此时属于地址传递情况,形参的改变会影响实
57、参。实参和形参的对应情况也有四种。 实参:数组名实参:数组名 数组名数组名 指针变量指针变量 指针变量指针变量 形参:数组名形参:数组名 指针变量指针变量 数组名数组名 指针变量指针变量 / /* * 程序程序L7_16.C L7_16.C 编写一个函数编写一个函数string_copy()string_copy()完成完成strcpy()strcpy()的作用,并验证。的作用,并验证。* */ /#include #include void string_copy(char void string_copy(char * *s1,char s1,char * *s2)s2) for (; f
58、or (;* *s2!=0;s1+,s2+)s2!=0;s1+,s2+) * *s1=s1=* *s2;s2; * *s1=0;s1=0; void main()void main() char str120,str2=I like C; char str120,str2=I like C; char char * *p1=str1,p1=str1,* *p2=str2;p2=str2; string_copy(p1,p2); string_copy(p1,p2); printf(str1: %st str2 : %sn,str1,str2); printf(str1: %st str2 :
59、%sn,str1,str2); / /* * 程序程序L7_17.C L7_17.C 编写一个函数编写一个函数 string_cut(char string_cut(char * *str,char c)str,char c),如果字符串,如果字符串strstr 中包含字符变量中包含字符变量c c,则输出其后的字符序列,否则输,则输出其后的字符序列,否则输出空字符。出空字符。* */ /#include #include void string_cut(char void string_cut(char * *str , char c)str , char c) for (; for (;*
60、*str!=0&str!=0&* *str!=c;str+);str!=c;str+); puts(str); puts(str); void main()void main() char string20=Beijing; char string20=Beijing; char ch; char ch; scanf(%c,&ch); scanf(%c,&ch); string_cut(string,ch); string_cut(string,ch); 运行结果:运行结果:str1: I like C str2 : I like Cstr1: I like C
61、 str2 : I like C阅读教材阅读教材P139P139:例:例7.167.16、例、例7.177.17、例、例7.187.18主讲主讲:吕元长吕元长l 指针数组定义指针数组定义 类型名类型名 * *数组名数组名 常量表达式常量表达式 ; 例如:例如:int int * *a5a5;表示指针数组;表示指针数组a a 的每一个元素都是指向的每一个元素都是指向intint型变量的指针变量。型变量的指针变量。/ /* * 程序程序L7_18.CL7_18.C功能:将多个字符串按字母顺序输出。功能:将多个字符串按字母顺序输出。* */ /#include #include #include #include void sort
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度高新技术场经营承包投资合同4篇
- 二零二五年度消防物联网技术研发与应用承包合同3篇
- 2025年股权代持业务委托合同范本3篇
- 二零二五年度水泥行业企业社会责任报告合同3篇
- 2025版旅行社与旅游住宿业联盟合作协议4篇
- 2025年度社区物业全面保洁及绿化养护服务合同3篇
- 2025年度项目管理人员劳动合同(含培训与发展)2篇
- 2025年度房地产项目策划与销售服务合同4篇
- 2025年度休闲度假景区场地经营合作协议4篇
- 专门药品第三方物流服务协议样本
- 2023年辽宁省交通高等专科学校高职单招(英语)试题库含答案解析
- GB/T 33688-2017选煤磁选设备工艺效果评定方法
- GB/T 304.3-2002关节轴承配合
- 漆画漆艺 第三章
- CB/T 615-1995船底吸入格栅
- 光伏逆变器一课件
- 货物供应、运输、包装说明方案
- (完整版)英语高频词汇800词
- 《基础马来语》课程标准(高职)
- IEC61850研讨交流之四-服务影射
- 《儿科学》新生儿窒息课件
评论
0/150
提交评论