C语言程序设计chapter课件

上传人:新** 文档编号:570118649 上传时间:2024-08-02 格式:PPT 页数:85 大小:1.22MB
返回 下载 相关 举报
C语言程序设计chapter课件_第1页
第1页 / 共85页
C语言程序设计chapter课件_第2页
第2页 / 共85页
C语言程序设计chapter课件_第3页
第3页 / 共85页
C语言程序设计chapter课件_第4页
第4页 / 共85页
C语言程序设计chapter课件_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《C语言程序设计chapter课件》由会员分享,可在线阅读,更多相关《C语言程序设计chapter课件(85页珍藏版)》请在金锄头文库上搜索。

1、 设设一一个个函函数数processprocess,在,在调调用用它它的的时时候,每次候,每次实现实现不同的不同的功能。功能。输输入入a a和和b b两个数两个数,第一次,第一次调调用的用的时时找出其中的大者,找出其中的大者,第二次第二次调调用的用的时时找出其中的小者。第三次找出其中的小者。第三次调调用求用求两两者之和。者之和。C语言程序设计chapter第六章第六章 指指 针针 指针是指针是C C语言的一个重要概念,也是语言的一个重要概念,也是C C语言的一个重语言的一个重要特色。深刻理解和正确使用指针是学习本章的基本要特色。深刻理解和正确使用指针是学习本章的基本要求。要求。C C程序设计中

2、使用指针可以程序设计中使用指针可以: :使程序简洁、紧凑、高效使程序简洁、紧凑、高效有效地表示复杂的数据结构有效地表示复杂的数据结构动态分配内存动态分配内存得到多个函数返回值得到多个函数返回值C语言程序设计chapter数据存储区数据存储区6.1 6.1 指针概述指针概述6.1.1 6.1.1 地址与指针地址与指针(一)地址与取地址运算(一)地址与取地址运算1.1.地址地址34.58.64121120a ab bc cd de ef f101010101012101210141014101810181022102210231023int a=3,b=4;int a=3,b=4;float c=

3、4.5,d=8.6;float c=4.5,d=8.6;char e=x,f=y;char e=x,f=y;编译或函数调用时编译或函数调用时为其分配内存单元为其分配内存单元内存中每个字节有内存中每个字节有一个编号一个编号-地址地址数据占有的数据占有的字节数由它字节数由它的类型决定的类型决定变量变量是对程序中数是对程序中数据存储空间的抽象据存储空间的抽象C语言程序设计chapter2.2.取地址运算取地址运算对普通变量:通过取地址运算符对普通变量:通过取地址运算符“&”得到该变量的地得到该变量的地址。址。对数组变量:数组名即为该数组的首地址。对数组变量:数组名即为该数组的首地址。(二)指针与指针

4、变量(二)指针与指针变量1.直接访问直接访问通过变量本身对变量进行存取的方式,称为直接访问。通过变量本身对变量进行存取的方式,称为直接访问。如定义:如定义:int i; i=3; int i; i=3; 这种访问方式只需要变量本身就得到了该变量的全部这种访问方式只需要变量本身就得到了该变量的全部信息,不需要其它内容,是直接的。信息,不需要其它内容,是直接的。C语言程序设计chapter数据存储区数据存储区34.58.64121120a ab bc cd de ef f1010101010121012101410141018101810221022102310232.间接访问间接访问 20002

5、0002002200220042004200620062008200820102010papapbpbpcpcpdpdpepepfpf101010121014101810221023指针变量指针变量通过指针实现对变量的访问方式,称为间接访问。通过指针实现对变量的访问方式,称为间接访问。C语言程序设计chapter间接对变量的访问方式:间接对变量的访问方式:首先要定义一个首先要定义一个指针变量指针变量;然后将一个同类型变量的地址赋给该指针变量(这时我然后将一个同类型变量的地址赋给该指针变量(这时我们称指针变量指向该变量);们称指针变量指向该变量);int *int *i_point,i_poin

6、t,i=3;i=3;i_point=&i;i_point=&i;i=3i=3i_pointi_point变量的指针变量的指针变量的地址变量的地址存放变量地址的变量存放变量地址的变量指针变量指针变量指针变量是一个特殊的变量,只能存放变量的地址指针变量是一个特殊的变量,只能存放变量的地址而不能用来存放其它类型的数据。而不能用来存放其它类型的数据。指针指向的变量指针指向的变量称为目标变量。称为目标变量。C语言程序设计chapter6.1.2 指针的类型与指针的定义指针的类型与指针的定义指针是有类型的,它的类型就是它所指向的实体的类型。指针是有类型的,它的类型就是它所指向的实体的类型。定义一个指针变量

7、定义一个指针变量格式:格式: 存储类型存储类型 类型标识符类型标识符 * *指针变量名;指针变量名;例:例:int *a,*b;int *a,*b; char *c, *ch; char *c, *ch; float *p1, *p2, *p; float *p1, *p2, *p;指针变量定义后,指针变量定义后,值不确定。值不确定。注意:注意: *p *p 与与 p p 的区别,的区别,p p才是指针变量;才是指针变量; 指针变量只能指向定义时所规定类型的变量指针变量只能指向定义时所规定类型的变量; 指针变量定义后,值不确定,应用前必须先赋值指针变量定义后,值不确定,应用前必须先赋值;C语言

8、程序设计chapter指针变量的赋值和初始化指针变量的赋值和初始化赋值语句:赋值语句: int i=3,*p; int i=3,*p;p p不定不定i i3 3p = &i;p = &i;i i的地的地址址3 3int *p; int *p; float a;float a;p=&a;p=&a;int *p=int *p=&i&i; ;int i;int i;int i;int i;int *p=&i;int *p=&i;int *q=p;int *q=p;int i;int i;static int *p=&i;static int *p=&i;int i=3,*p=&i;int i=3,*

9、p=&i;初始化:初始化: 一般形式:一般形式: 存储类型存储类型 数据类型数据类型 * *指针名指针名= =初始地址值初始地址值;C语言程序设计chapter20002010i的地址的地址指针变量指针变量的地址的地址i_pointi=106.1.3 指针变量的引用指针变量的引用有关指针的运算符有关指针的运算符取变量地址运算符取变量地址运算符。&a&a表示变量表示变量a a的地址。的地址。指针运算符指针运算符( (取指针所指向变量的内容取指针所指向变量的内容) )。 *p*p表示表示p p所指向的变量。所指向的变量。&*两者关系:两者关系:互为互为逆运算逆运算int i=10,*i_point

10、;int i=10,*i_point;i_point=2000i_point -i_point -指针变量,它的内容是地址量指针变量,它的内容是地址量* *i_point -i_point -指针的指针的目标变量目标变量,它的内容是,它的内容是变量值变量值& &i_point -i_point -指针变量占用的内存地址指针变量占用的内存地址i_point = &i;i_point = &i;i *i_pointi *i_point&i i_point&i i_pointi=10 *i_point=10i=10 *i_point=10C语言程序设计chapter例例 main( ) main(

11、) int i=10; int i=10; int *p; int *p; *p=i;*p=i; printf(%d,*p); printf(%d,*p); 指针变量必指针变量必须先赋值,须先赋值,再使用再使用 main( ) main( ) int i=10,k; int i=10,k; int *p=&k; int *p=&k; *p=i;*p=i; printf(%d,*p); printf(%d,*p); 危险!危险!C语言程序设计chapter指针变量可进行的操作指针变量可进行的操作int a,b,*p1,*p2,*p3; int a,b,*p1,*p2,*p3; 输出:输出: pr

12、intf(%x,%x,p1,p2); printf(%x,%x,p1,p2); printf(%d,%d,*p1,*p2); printf(%d,%d,*p1,*p2); 增减:增减: p+; p-; p+=4; p+; p-; p+=4; (只能和整数运算)(只能和整数运算) *p+; *p-; *p+; *p-; 两指针加减两指针加减: p1-p2; p1+p2;: p1-p2; p1+p2; 两指针比较两指针比较: if(p1p2) if(p1p2) if(p1p2, p1p2, p1=p2 ;pa0a1a数组数组p+1,a+1p+i,a+ip+5,a+5 p1+p2 ;p2p1i为整数

13、为整数C语言程序设计chaptera0a1a2a3a数组数组.aa+1a+2a+3a0a1a2a3a+iai* *a* *(a+1)* *(a+2)* *(a+3)* *(a+i)a0a1a2a3a数组数组.pp+1p+2p+3p+ip0p1p2p3pi* *p* *(p+1)* *(p+2)* *(p+3)* *(p+i)下标法下标法指针法指针法ai pi * *(a+i) * *(p+i)对数组元素的访问方式:对数组元素的访问方式:C语言程序设计chapter多种方法访问数组元素多种方法访问数组元素设有如下定义设有如下定义 int a5=1,3,5,7,9,i,*p;输出各数组元素。输出各

14、数组元素。main() int a5=1,3,5,7,9; for(i=0; i5; i+) printf( %dn, ai );(1)下标法:下标法:13579a 数组数组pia0a1a2a3a4pint *p=a;C语言程序设计chapter(2)地址法:地址法:main() int a5=1,3,5,7,9; for(i=0; i5; i+) printf( %dn, * *(a+i) );13579a 数组数组a+0a+0a+1a+1a+2a+2a+3a+3a+4a+4int * *p=a; * *(p+i)C语言程序设计chaptermain() int a5=1,3,5,7,9;

15、int * *p=a; for( ; pa+5; p+) printf(%d, * *p );(3)指针法:指针法:13579a 数组数组a+0a+0a+1a+1a+2a+2a+3a+3a+4a+4p int * *p=a, i; for( i=0; i5; i+) printf( %d, * *p+);ppppC语言程序设计chapter指针变量运算的注意点:指针变量运算的注意点:* *p+, * *p-:等价于:等价于* *(p+),* *(p+) ; * *+p, * *-p:等价于:等价于* *(+p),* *(+p) ;(* *p)+, (* *p)-:相当于:相当于pi+, pi-

16、 ; +(* *p), -(* *p):相当于:相当于+pi, -pi ;void main() int a =5,8,7,6,2,9,3; int y,* *p=&a1; y=(* *-p)+; printf(%d,y); printf(%d,a0); 5876293pp6y=5, a0=6C语言程序设计chapter 指针变量的当前值指针变量的当前值main( ) int * *p,i,a10; p=a; for (i=0;i10,i+) scanf (%d,p+); printf (n); for (i=0;i10;,i+) printf (%dn,* *p+);pa0a1a2a3a4a

17、5a6a7a8a9a a 数组数组p=a;ppppppppppppppC语言程序设计chapter6.2.2 二维数组的指针表示方法二维数组的指针表示方法对于一维数组对于一维数组array :(1)数组名)数组名array表示数组的首地址,即表示数组的首地址,即array0的地址;的地址;(2)数组名)数组名array是地址是地址常量常量(3)array+i是元素是元素arrayi的地址的地址(4)arrayi * *(array+i)C语言程序设计chaptera0a1a22002a01a00a03a02a11a10a13a12a21a20a22a2320002008201620102018

18、200820162000aa+1a+2a0+1* *(a+0)+1a1+1* *(a+1)+1a2+1* *(a+2)+1int a34;对于二维数组:对于二维数组: a是是数组名数组名,包含三个元素包含三个元素a0,a1,a2 每个元素每个元素ai又是一个一又是一个一维数组,包含维数组,包含4个元素个元素C语言程序设计chaptera2a2a1a1a0a0a00a01a02a03a10a11a12a13a20a21a22a23a aa+1a+1a+2a+2a0a0+1a0+2a0+3* *(ai+j) * *(* *(a+i)+j) aij 第第i行第行第j列的元列的元素值素值a二维数组的首

19、地址,即第二维数组的首地址,即第0行的首地址行的首地址a+i第第i行的首地址行的首地址ai * *(a+i)第第i行第行第0列的元素地址列的元素地址ai+j * *(a+i)+j第第i行第行第j列的元素地址列的元素地址a1a1+1a1+2a1+3* *(a+1)* *(a+1)+1* *(a+1)+2* *(a+1)+3C语言程序设计chapter101610081000100010021004100610081010101210141016101810201022a aa+1a+1a+2a+2a1a1+1a1+2a1+3* *(a+1)* *(a+1)+1* *(a+1)+2* *(a+1)

20、+3a+i = &ai = ai = * *(a+i) = &ai0, 数值相等,含义不同。数值相等,含义不同。ai=* *(a+i),所以,所以a+i是是ai的二级指针;的二级指针;a+i &ai 表示第表示第i行首地址,指向行(行地址)。行首地址,指向行(行地址)。ai * *(a+i) &ai0 表示第表示第i行第行第0列元素地址,列元素地址, 指向列(列地址)指向列(列地址)C语言程序设计chaptera2a2a1a1a0a0a00a01a02a03a10a11a12a13a20a21a22a23a aa+1a+1a+2a+2a10元素的地址表示:元素的地址表示: &a10 a1 *

21、*(a+1) a+1 (int * *) (a+1)a12元素的地址表示:元素的地址表示: &a12 a1+2 * *(a+1)+2 &a00+1* *4+2a12元素值:元素值: a12 * *(a1+2) * *(* *(a+1)+2) * *(&a00+1* *4+2)a10元素值:元素值: a10 * *a1 * *(* *(a+1) *(a+1)C语言程序设计chapter&aijai+j* *(a+i)+jaij* *(ai+j)* *(* *(a+i)+j)(ai)j(* *(a+i)j二维数组表示法归纳二维数组表示法归纳二维数组元素的地址二维数组元素的地址访问二维数组元素访问二

22、维数组元素* *p+j* *(* *p+j)(* *p)jC语言程序设计chapter指向一维数组的指针变量指向一维数组的指针变量格式:类型名格式:类型名 (* *指针变量名)指针变量名) 长度长度 ;例如:例如:int (* *p)4;含义:含义:p是指针变量,可让是指针变量,可让p指向二维数组某一行,即指指向二维数组某一行,即指 向含有向含有4个元素的一维数组,元素的类型是个元素的一维数组,元素的类型是int。int (* *p)4;p=a;p=a+1;p+;a34p p p一维数组指针变一维数组指针变量维数和二维数量维数和二维数组组列数列数必须相同必须相同。C语言程序设计chapter通

23、过通过(* *p)j 可以访问当前行第可以访问当前行第 j 列的元素列的元素a00a01a02a03a10a11a12a13a20a21a22a23 (* *p)0 (* *p)1 (* *p)2 (* *p)3p(* *p)j表示当前行的第表示当前行的第j个元素个元素如果执行如果执行p+, 指针将指向下一行,访问下一行的元素。指针将指向下一行,访问下一行的元素。p(ai)j (* *(a+i)j (* *p)jC语言程序设计chapter通过通过 * *(* *p+j) 的形式可以访问当前行第的形式可以访问当前行第 j 列的元素。列的元素。a00a01a02a03a10a11a12a13a2

24、0a21a22a23p* *p+j表示当前行的第表示当前行的第j个元素的地址个元素的地址* *p+0元素的地址元素的地址元素值元素值* *p+1* *p+2* *p+3* *(* *p+0)* *(* *p+1)* *(* *p+2)* *(* *p+3)&aij ai+j * *(a+i)+j * *p+jC语言程序设计chaptermain( ) int a35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; int *p; for(p=a0; pa0+3* *5; p+) printf(%d,* *p); printf(n); 用各种方法访问二维数组各元素用各种

25、方法访问二维数组各元素例例6.7 采用指向采用指向二维数组元素二维数组元素的指针变量的指针变量int * *p,i;p=a0;for(i=0; i3* *5; i+) printf(%d,* *p+);printf(n);p=&a00; p=a; p=(int * *)a; p=* *a; C语言程序设计chapter用各种方法访问二维数组各元素用各种方法访问二维数组各元素main( ) int a35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; int i,j,(* *p)5; p=a; for( i=0; i3; i+ ) for( j=0; j5; j+ )

26、 printf(%d, (* *(p+i)j ); printf(n); 例例6.8 指向一维数组的指针变量指向一维数组的指针变量(ai)j(* *(a+i)j;pa+3;p+(* *p)jC语言程序设计chapter用各种方法访问二维数组各元素用各种方法访问二维数组各元素main( ) int a35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; int i,j,(* *p)5; p=a; for( i=0; i3; i+ ) for( j=0; j5; j+ ) printf(%d, * *(* *(p+i)+j) ); printf(n); 例例6.8 指向一

27、维数组的指针变量指向一维数组的指针变量aij* *(ai+j)* *(* *(a+i)+j);pa+3;p+* *(* *p+j)C语言程序设计chaptermain( ) int a35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15; printf(%d,%d,%d,a,a+1,a+2); printf(%d,%d,%d,*a,*a+1,*a+2); printf(%d,%d,%d,*(a+1),*(a+1)+1,*(a+1)+2); printf(%d,%d,%d,*(a+2),*(a+2)+1,*(a+2)+2); printf(%d,%d,%d,&a0,&a1

28、,&a2); printf(%d,%d,%d,&a00,&a01,&a02); printf(%d,%d,%d,a0,a0+1,a0+2); printf(%d,%d,%d,*a,*(a+1),*(a+2); printf(%d,%d,%d,*(a1+2),*(*(a+1)+2),a12);例例6.9 6.9 数组的行地址和列地址数组的行地址和列地址C语言程序设计chapteraa+1a+2printf(%d,%d,%d,a,a+1,a+2);a35第第0,1,2行的行地址行的行地址C语言程序设计chapteraa+1a+2* *a+0* *a+1* *a+2printf(%d,%d,%d,*

29、 *a,* *a+1,* *a+2);printf(%d,%d,%d,* *(a+1),* *(a+1)+1,* *(a+1)+2);printf(%d,%d,%d,* *(a+2),* *(a+2)+1,* *(a+2)+2);第第0,1,2行前行前3个元素的地址个元素的地址C语言程序设计chapteraa+1a+2&a0&a1&a2printf(%d,%d,%d,&a0,&a1,&a2);第第0,1,2行的行地址行的行地址ai = * *(a+i)a+i = &aiC语言程序设计chapteraa+1a+2&a00printf(%d,%d,%d,&a00,&a01,&a02);&a01 &

30、a02第第0行行3个元素的地址个元素的地址C语言程序设计chapteraa+1a+2a0a0+1a0+2printf(%d,%d,%d,a0,a0+1,a0+2);第第0行行3个元素的地址个元素的地址C语言程序设计chapter* *a* *(a+1)* *(a+2)printf(%d,%d,%d,* *a,* *(a+1),* *(a+2);a0a1a2第第0,1,2行中第行中第0列元素的地址列元素的地址ai = * *(a+i)C语言程序设计chapteraa+1a+2a1a1+1a1+2printf(%d,%d,%d,* *(a1+2),* *(* *(a+1)+2),a12);第第1行

31、第行第2列元素的值列元素的值C语言程序设计chapter6.2.3 指针与字符串指针与字符串在在C语言中,字符串的表示形式有两种方式:语言中,字符串的表示形式有两种方式:定义一个字符数组,用字符数组的数组名来访问字符串;定义一个字符数组,用字符数组的数组名来访问字符串;定义一个字符串指针,通过字符串指针的指向来访问字定义一个字符串指针,通过字符串指针的指向来访问字符串;符串;C语言程序设计chapter字符串的表示形式字符串的表示形式1.用字符数组实现用字符数组实现例:例:main( ) char str =Internet Explorer; printf(%sn,str); printf(

32、%sn,str+9);main( ) char str ; strcpy(str,Internet Explorer); printf(%sn,str);str0str1str20rerolpxEtenretnIstr9str17Internet ExplorerExplorerC语言程序设计chapter字符串的表示形式字符串的表示形式2.2.用字符指针实现用字符指针实现例:例:main( ) char *p_str=Internet Explorer; printf(%sn,p_str); printf(%sn,p_str+9); char *p_str; p_str=Internet E

33、xplorer; printf(%sn,p_str); p_str+=9; printf(%sn,p_str); char str =Internet Explorer; char *p_str=str; printf(%sn,p_str); p_str+=9; printf(%sn,p_str); while(*p_str) putchar(*p_str+);str0str1str20rerolpxEtenretnIstr9str17p_strC语言程序设计chapterchar s10char *p性性 质质地址常量地址常量指指针变针变量量定定义义及初始化及初始化char s =Inter

34、net; char *p=Internet;赋赋 值值s=Internet; strcpy(s,Internet); p=Internet;strcpy(p,Internet);使使 用用s不能自加不能自加/减减p可以自加可以自加/减减字符串数组和字符串指针变量的比较字符串数组和字符串指针变量的比较char s =abc; 与与 char s =a,b,c;的区别的区别注意:注意:C语言程序设计chapter!字符指针字符指针接受接受键入键入字符串时字符串时,必须必须先开辟存储空间先开辟存储空间char str10;scanf(%s,str); char *p;scanf(%s,p);char

35、 *p,str10;p=str;scanf(%s,p); 必须改为必须改为C语言程序设计chapter6.2.4 指针数组指针数组指针数组的概念:指针数组的概念: 指针数组是一种特殊的数组,每个元素的类型都是指指针数组是一种特殊的数组,每个元素的类型都是指针类型(即地址),其它性质与一般数组相同。针类型(即地址),其它性质与一般数组相同。用于处理二维数组或多个字符串用于处理二维数组或多个字符串定义:数组中的元素为指针变量定义:数组中的元素为指针变量定义形式:定义形式: 存储类型存储类型 数据类型数据类型 * *数组名数组名 数组长度数组长度 ;例:例:int * *p4; char * *cp

36、10;注意区分:注意区分:int * *p4; 与与 int (* *p)4;C语言程序设计chapter赋值赋值:main( ) int b33,*pb3; pb0=b0; pb1=b1; pb2=b2; .指针数组赋值与初始化指针数组赋值与初始化(对二维数组对二维数组)初始化初始化:main( ) int b33,*pb =b0,b1,b3; .b33pb3pb0pb1pb2C语言程序设计chapter赋值赋值:main( ) char * *p4; p0= Fortran; p1= Lisp; p2= Basic; p3= NULL; .初始化初始化:main( ) char * *p

37、=Fortran, Lisp,Basic,NULL; .00nartroF0psiL0cisaBp0p1p2p3指针数组赋值与初始化指针数组赋值与初始化(对字符串对字符串)main( ) char a =Fortran; char b =Lisp; char c =Basic; char * *p4; p0=a; p1=b; p2=c; p3=NULL; C语言程序设计chapter指针数组主要用于字符串操作。指针数组主要用于字符串操作。char str 15=CPU,Computer,Microprocessor;0rossecorporciM0retupmoC0UPCstr0str1str

38、20retupmoCceosrpsoorr0ciM0UPC101310041000p0p1p2char *p3=CPU,Computer,Microprocessor;二维数组与指针数组区别:二维数组与指针数组区别:C语言程序设计chapter例例6.13 在存储的一个班的学生姓名中,根据从键盘上在存储的一个班的学生姓名中,根据从键盘上输入的姓名,查找是否为该班学生。输入的姓名,查找是否为该班学生。例例6.14 有三个字符串,要求按字母顺序输出。有三个字符串,要求按字母顺序输出。0erutcurtsataDg0niseDretupmoC0egaugnaLC0erutcurtsataDg0nis

39、eDretupmoC0egaugnaLC0erutcurtsataDg0niseDretupmoC0egaugnaLCstring2string1string0string2string1string0string2string1string0C语言程序设计chapter例例6.16 用双重指针输出二维数组元素。用双重指针输出二维数组元素。main() int a34=1,2,3,4,5,6,7,8,9,10,11,12; int * *arr3; int i,*p; p=arr; for(i=0;i3;i+) arri=ai; printf(p=%X, *p=%X, *p=%dn,p,* *

40、p,*p); for(i=0;i4;i+) printf(%d, ,* *(* *p+i); 121110987654321a2a1a0arra数组数组arr指针数组指针数组p指针数组的地址指针数组的地址=a0,a00的地址的地址a00元素值元素值C语言程序设计chapter6.3 6.3 指针与函数指针与函数指针与函数的关系指针与函数的关系用指针作为函数参数用指针作为函数参数函数的返回值是指针函数的返回值是指针指向函数的指针指向函数的指针C语言程序设计chaptermain( ) void sub(int,int); int x=2,y=6; sub(x,y); printf(%d,%dn,

41、x,y);sub(int px,int py) px=10; py=20; 分析分析 值传递值传递单向传递,单向传递,因而形参的值的改变因而形参的值的改变并不影响实参的值。并不影响实参的值。一般变量作为参数一般变量作为参数6.3.1 6.3.1 指针作为函数参数指针作为函数参数x=2x=2pypypxpxy=6y=6px=xpx=xpy=ypy=ypx=10py=20C语言程序设计chaptermain( ) void sub(int,int); int x,y; sub(&x,&y); printf(%d,%dn,x,y);sub(int *px,int *py) *px=10; *py=2

42、0;变量地址作为参数变量地址作为参数 分析分析 地址传递地址传递函数中通过函数中通过形参引用传来的地址,形参引用传来的地址,从而改变了主调函数中从而改变了主调函数中局部变量的值。局部变量的值。x xpypypxpxy y2000200020022002px=2000px=2000py=2002py=2002x=10x=10y=20y=206.3.1 6.3.1 指针作为函数参数指针作为函数参数C语言程序设计chaptermain( ) void sub(int,int); int x,y,*p1,*p2; p1=&x; p2=&y; sub(p1,p2); printf(%d,%dn,x,y)

43、;sub(int *px,int *py) *px=10; *py=20;变量的指针作为参数变量的指针作为参数px=2000px=2000p2=2002p2=2002p1=2000p1=2000x xy y2000200020022002py=2002py=20026.3.1 6.3.1 指针作为函数参数指针作为函数参数x=10y=20C语言程序设计chapter例:例:6.19 有一数组有有一数组有10个元素,要求将其中最大和最小的个元素,要求将其中最大和最小的元素值存入元素值存入a和和b并输出。并输出。main() void max_min(int , int *, int *, int)

44、; int arr10=1,8,10,2,-5,0,7,15,4,-3,*p1,*p2, a, b; p1=&a; p2=&b; max_min(arr,p1,p2,10); printf(MAX=%d,MIN=%d,a,b);void max_min(int dat ,int *pt1,int *pt2,int n) int i; *pt1=*pt2=dat0; for(i=1;i*pt1) *pt1=dati; if(dati*pt2) *pt2=dati; C语言程序设计chapter6.3.2 数组指针作为函数参数数组指针作为函数参数main( ) int array10; . fun

45、 (array,10); .int fun (int arr ,int n) 函数体函数体 x=arri; x=*arr+;int fun (int *point,int n) 函数体函数体 x=*point+; x=pointi;采用下标法访采用下标法访问数组元素问数组元素arrayi 采用指针法访采用指针法访问数组元素问数组元素arrayimain( ) int array10; int *p=array; fun (p,10); .C语言程序设计chapter数组名作函数参数,是数组名作函数参数,是地址传递地址传递指向数组的指针变量也可以作为函数参数,也是指向数组的指针变量也可以作为函数

46、参数,也是地址传递地址传递数组名数组名作函数参数和作函数参数和数组指针数组指针作函数参数作函数参数实参与形参的对应关系实参与形参的对应关系实实 参参形形 参参数组数组名名数组数组名名指指针变针变量量指指针变针变量量数组数组名名指指针变针变量量C语言程序设计chapter例:例:6.20 求二维数组中全部元素之和。求二维数组中全部元素之和。main( ) int arr_add(int arr ,int n); int a34=1,3,5,7,9,11,13,15,17,19,21,23); int *p,total; p=a0; total=arr_add(p,3*4); printf(tot

47、al=%d,total);arr_add(int arr ,int n); int i,sum=0; for(i=0;in;i+) sum+=arri; return (sum);arr_add(int *arr,int n); int i,sum=0; for(i=0;in;i+) sum+=*arr+; return (sum);C语言程序设计chapter例:例:6.21 求一维数组中下标为奇数的元素之和。求一维数组中下标为奇数的元素之和。main() int odd_add(int *pt,int n); int a10=1,2,3,4,5,6,7,8,9,10); int *p,to

48、tal; p=&a1; total=odd_add(p,10); printf(total=%d,total);odd_add(int *pt,int n); int i,sum=0; for(i=0;in;i+=2,pt+=2) sum+=*pt; return (sum);odd_add(int arr ,int n); int i,sum=0; for(i=0;i copy.exe source.c temp.c有有3个字符串参数的命令行个字符串参数的命令行带参数的带参数的main函数形式:函数形式:命令行中参数个数命令行中参数个数指针数组,保存指针数组,保存命令行命令行参数中各字符串首

49、地址参数中各字符串首地址C语言程序设计chapter命令行参数的说明命令行参数的说明形参也可以用其它名字,习惯上为形参也可以用其它名字,习惯上为 argc 和和 argvargc 和和 argv 的值得获得:的值得获得: 系统调用系统调用main函数时自动传递函数时自动传递。如有参程序如有参程序myprog.c, myprog.exe 执行执行 C:myprog argument1 argument2编译和链接编译和链接argc的值为的值为3argv2argv1argv0C语言程序设计chaptermain( int argc, char *argv ) int i; for(i=1; i t

50、est Computer and C Language则:则:arg1: Computer arg2: and arg3: C arg4: Languageargv1argv2argv3argv4ComputerandCLanguageargvargv0testC语言程序设计chaptermain(int argc, char *argv )带参带参main函数的定义还可以写成:函数的定义还可以写成:main(int argc, char *argv)main(int argc, char argv )C语言程序设计chapter6.3.6 指针数据小结指针数据小结6.4.1 常用指针类型变量

51、归纳常用指针类型变量归纳定定义义形式形式含含 义义int *pp为为指向整型指向整型数数据的指据的指针变针变量量int(*p)np为为指向含指向含n个个元素的一元素的一维维整型整型数组数组的指的指针变针变量量int (*p)( )p为为指向函指向函数数的指的指针变针变量,量,该该函函数数返回整型返回整型数数int *pnn个个指向整型指向整型数数据的指据的指针变针变量量组组成的指成的指针数组针数组int *p( )p为为返回指返回指针针的函的函数数,该该指指针针指向一指向一个个整型整型数数据据int *pp为为指指针变针变量,量,它它指向一指向一个个指向整型指向整型数数据的指据的指针变针变量量

52、C语言程序设计chapter一级指针变量与一维数组的关系:一级指针变量与一维数组的关系:数组名是指针数组名是指针(地址地址)常量;常量;int *p; 与与 int a10; 系统只给系统只给p分配能保存一个指针值的内存区分配能保存一个指针值的内存区(一般一般2字节)字节);而给;而给a分配分配2*10字节的内存区字节的内存区;若若p=a; p+i 是是 ai的地址;的地址;数组元素的表示方法数组元素的表示方法:下标法和指针法:下标法和指针法: 若若p=a,则则pi ai *(a+i) *(p+i);形参数组实质上是指针变量,即形参数组实质上是指针变量,即int p int *p;C语言程序设

53、计chapter二维数组与一维数组指针变量的关系:二维数组与一维数组指针变量的关系:int a510 与与 int (*p)10;二维数组名是指向有二维数组名是指向有n个元素的一维数组的指针常量个元素的一维数组的指针常量;aij(ai)j(*(a+i)j(*p)j 二维数组形参实际上是一维数组指针变量,二维数组形参实际上是一维数组指针变量, 即即int x 10 int (*x)10;系统只给系统只给p分配能保存一个指针值的内存区分配能保存一个指针值的内存区(一般一般2字节);而给字节);而给a分配分配2*5*10字节的内存区字节的内存区。变量定义变量定义(不是形参)时两者不等价不是形参)时两

54、者不等价:p=a+i; 使使p指向二维数组的第指向二维数组的第i行行,p+,指向下一行,指向下一行;C语言程序设计chapter二级指针与指针数组的关系:二级指针与指针数组的关系:int *p; 与与 int *a10; 指针数组名是二级指针常量指针数组名是二级指针常量;若若p=a; p+i 是是ai的地址的地址;系统只给系统只给p分配能保存一个指针值的内存区;而给分配能保存一个指针值的内存区;而给a分配分配10块块(每块一般是每块一般是2字节字节)内存区,每块可保存一内存区,每块可保存一个指针值个指针值。指针数组作形参,指针数组作形参,int *p 与与int *p完全等价完全等价,但作但作

55、为变量定义两者不同为变量定义两者不同:C语言程序设计chapter6.4.2 指针的运算指针的运算(一一)指针与整数相加指针与整数相加(减减)移动指针的位置,以其指针类型长度为单位。移动指针的位置,以其指针类型长度为单位。ppppppint型数据型数据float型数据型数据 C语言程序设计chapter(二二)指针的关系运算与相减运算指针的关系运算与相减运算两个指针变量比较:两个指针变量比较:比较的结果是两个元素在数组中的前后位置,若两个比较的结果是两个元素在数组中的前后位置,若两个指针相等表示指向的是同一个元素。指针相等表示指向的是同一个元素。此类运算必须是两个指针变量指向同一个数组的元素此

56、类运算必须是两个指针变量指向同一个数组的元素两个指针变量相减:两个指针变量相减:两个指针变量的结果是两个指针之间的元素个数。两个指针变量的结果是两个指针之间的元素个数。(三三)指针赋值指针赋值只能将对应类型的变量地址赋值给指针只能将对应类型的变量地址赋值给指针float f1,f2,*pf; pf=&f1; pf=&f2;C语言程序设计chapter同类型指针间可以相互赋值同类型指针间可以相互赋值int a,b,*pa=&a,*pb=&b;pa=pb;指针增指针增1、减、减1注意注意+和和-运算与运算与*运算优先级相同,它们在同运算优先级相同,它们在同一个表达式中时,应按照结合性决定运算顺序。

57、一个表达式中时,应按照结合性决定运算顺序。例:例:int x =2,3,7,9; *px=x; *(px+1)=5;y = * +px;y = + *px;53C语言程序设计chapter6.4.3 指向指向void类型的指针类型的指针 void 指针类型为指针类型为“空类型空类型”,它可定义一个指针变量,它可定义一个指针变量,但不指定它是指向哪一种类型数据的。但不指定它是指向哪一种类型数据的。char *p1;void *p2;p1 = (char *) p2;p2 = (void *) p1;函数也可以定义为函数也可以定义为void *类型类型: void *fun(int x,int y)表示函数表示函数 fun 返回的是一个地址,它指向返回的是一个地址,它指向“空类型空类型”。 对于这种类型的指针在给另一个指针变量赋值时,要进对于这种类型的指针在给另一个指针变量赋值时,要进行强制类型变换,使之适合于被赋值的变量的类型。行强制类型变换,使之适合于被赋值的变量的类型。C语言程序设计chapter

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号