c语言程序设计第六章 指针_第1页
c语言程序设计第六章 指针_第2页
c语言程序设计第六章 指针_第3页
c语言程序设计第六章 指针_第4页
c语言程序设计第六章 指针_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、6.1 指针的概念指针的概念6.2 指针变量的定义和引用指针变量的定义和引用6.3 指针与数组指针与数组6.4 指针与函数指针与函数6.5 多级指针多级指针6.1 指针的概念指针的概念q指针是指针是C语言的重要特色,正确的应语言的重要特色,正确的应用指针,可以:用指针,可以:v使程序简洁、紧凑、高效;使程序简洁、紧凑、高效;v有效地表达复杂的数据结构;有效地表达复杂的数据结构;v动态分配内存,直接处理物理内存动态分配内存,直接处理物理内存地址;地址;v得到多于一个的函数返回值。得到多于一个的函数返回值。变量与地址变量与地址q变量变量是对程序中数据存储空间的抽象是对程序中数据存储空间的抽象q变量

2、的变量的地址地址是其存储单元的首字节地址是其存储单元的首字节地址 程序中程序中: short i; float k; .2000200120022005内存内存02003编译或函数调用编译或函数调用时为时为变量分配内变量分配内存单元存单元ki指针与指针变量指针与指针变量q指针指针:变量的地址:变量的地址q指针变量指针变量:专门用来存放变量地址的变量:专门用来存放变量地址的变量.200020042005变量变量 i10变量变量i_pointer200120022003变量变量i的内的内容容指向变量指向变量i的的指针变量指针变量变量变量i 的的地地址址(指针)(指针)i_pointer的内容是的内

3、容是i 的地址的地址2000&与与*运算符运算符q&(取地址运算):取变量的地址(取地址运算):取变量的地址设设i是变量,则是变量,则&i为为i的地址。的地址。q*(取内容运算):取指针所指向的目标变量(取内容运算):取指针所指向的目标变量设设i_pointer是指向变量是指向变量i的指针变量,则的指针变量,则*i_pointer 为为i。q两者互为逆运算,即以下表达式是等价的:两者互为逆运算,即以下表达式是等价的: i_pointer &i *i_pointer i i_pointer &(*i_pointer) i *(&i)&ii_pointer10i*i_pointer&与与*运算示例

4、运算示例q设变量设变量i, j和指针变量和指针变量p1, p2在内存的位置在内存的位置和内容如下图,则和内容如下图,则&和和*的运算结果为:的运算结果为:.2000200420062005 i102001200220032000 p1 j0p220022007表达式表达式值值表达式表达式值值i10p12000j0p22002&i2000&p1不用不用&j2002&p2不用不用*i非法非法*p110*j非法非法*p20访问变量的方式访问变量的方式q对变量的访问是指对变量的取值或赋值对变量的访问是指对变量的取值或赋值操作。可采用两种方式:操作。可采用两种方式:v直接访问直接访问:通过变量名直接访问

5、。:通过变量名直接访问。v间接访问间接访问:通过指向该变量的指针来:通过指向该变量的指针来访问,如通过访问,如通过i_pointer访问访问i。 i_pointer 200010i地址:地址:2000指向指向地址:地址:2004直接访问与间接访问直接访问与间接访问例例 i=3; -直接访问直接访问.2000200420062005 i10i_pointer20012002200320003例例 *i_pointer=20; -间接访问间接访问206.2 指针变量的定义和引用指针变量的定义和引用q指针变量的定义指针变量的定义q指针变量的初始化指针变量的初始化q指针变量的引用指针变量的引用q指针运

6、算指针运算指针变量的定义指针变量的定义q定义形式:定义形式: 类型说明符类型说明符 * 指针变量名;指针变量名;q例:例:int *ip, i; /* 定义定义ip为整型指针变量,为整型指针变量,i为整型变量为整型变量*/char * name; /* 定义定义name为为char型指针变量型指针变量*/float *fp1; /* 定义定义fp1为为float型指针变量型指针变量*/指针的目标变指针的目标变量的数据类型量的数据类型表示定义指表示定义指针变量针变量合法标合法标识符识符指针变量的初始化指针变量的初始化q一般形式:一般形式:数据类型数据类型 *指针变量名指针变量名=初始地址值;初始

7、地址值;例例: : int i, *p=&i; float *p1=&i; int *p2=p; int *p3=100; static *p4=&i; 可以用已初始化的指可以用已初始化的指针变量作初值针变量作初值不能用不能用auto变量的地址变量的地址去初始化去初始化static型指针型指针指针变量与目标变量指针变量与目标变量的的数据类型数据类型应一致应一致不能用不能用非地址型非地址型数据数据为指针变量赋值为指针变量赋值空指针与野指针空指针与野指针q空指针空指针:其值为:其值为0(用(用NULL表示)的指表示)的指针。如:针。如: int *p=0; 或或 int *p=NULL;q野指针野

8、指针:未初始化的指针,其值不确定。:未初始化的指针,其值不确定。q空指针不指向任何目标,野指针指向不空指针不指向任何目标,野指针指向不确定的目标。确定的目标。q比较:比较: int i; int *p1=&i; /*p1指向变量指向变量i*/ float *p2; /*p2的指向不确定的指向不确定*/ char *p3=NULL; /*p3不指向任何目标不指向任何目标*/指针变量的引用指针变量的引用q通过引用指针变量,可以间接访问目标通过引用指针变量,可以间接访问目标变量。修改指针,则访问目标也改变。变量。修改指针,则访问目标也改变。q例:例: int i, j; int *p; i=0; j

9、=i; /* 直接访问直接访问i , j */ p = &i; /* p指向指向i */ *p = 100; /* 间接访问间接访问i */ p = &j; /* p指向指向j */ *p = 200; /* 间接访问间接访问j */结果:结果:i=100j=200指针变量应用举例指针变量应用举例例例6-1#includevoid main() int var;int *p;var = 10; p = &var; /*必须先对必须先对p 赋值,才能引用赋值,才能引用*/ printf(&var=%x, p=%xn, &var, p); printf(var=%d, *p=%dn, var, *

10、p);*p=100;printf(var=%d,*p=%dn, var, *p);注意:注意:引用空指针和野引用空指针和野指针是严重的运行错误指针是严重的运行错误!指针应用举例指针应用举例例例6-2:输入两个数,按由大到小的顺序输出。:输入两个数,按由大到小的顺序输出。void main()int *p1, *p2, *p, a, b; scanf(%d,%d, &a, &b); p1=&a; p2=&b; if(a * +,-如:如:x=*p+; x=*p; p=p+1; x=*+p; p=p+1; x=*p; x=(*p)+; x=*p; *p=*p+1;q指针相减运算:设指针相减运算:设

11、p1和和p2指向同一数组指向同一数组中的不同元素,则中的不同元素,则 p1-p2为两个指针之为两个指针之间的数组元素个数。间的数组元素个数。如:如:int a10; int *p=&a0; int *p1=&a2; int *p2=&a5;则:则:p2-p1的值为的值为3a0a1a2a3a4a5a6a7a8a9a数组数组 p p1 p2 指针的关系运算指针的关系运算q若若p1和和p2指向同一数组,则:指向同一数组,则:vp1p2 表示表示p1指的元素在后指的元素在后vp1=p2 表示表示p1与与p2指向同一元素指向同一元素vp1!=p2 表示表示p1与与p2指向不同元素指向不同元素q若若p1与

12、与p2不指向同一数组,比较无意义不指向同一数组,比较无意义q单个指针可与空指针值比较:单个指针可与空指针值比较: p=NULL 或或 p!=NULL 指针的赋值运算指针的赋值运算q只能用同类型的地址常量或变量对指针赋只能用同类型的地址常量或变量对指针赋值。值。q常用赋值方法举例:常用赋值方法举例:double d, a5, *p, *p1, *p2;p1=&d; /*将变量将变量d的地址赋值的地址赋值p1 */p2=p1; /*将指针将指针p1复制给指针复制给指针p2 */p=a; /*将数组将数组a的首地址赋给的首地址赋给p*/p=&a3; /*将数组元素将数组元素a3的地址赋给的地址赋给p

13、 */指针运算举例指针运算举例q例例6-3:输入一个整数,统计其数据位数(不:输入一个整数,统计其数据位数(不包括符号位)并对不正确的字符进行判断。包括符号位)并对不正确的字符进行判断。 #includevoid main( ) char *p, number100=;int flag=0, count=0;p=number;printf(Please input a number: );scanf(“%s”, number); /*检查第一个字符,若不是检查第一个字符,若不是+ - 09 则错则错*/if(*p)=-|(*p)=+) flag=1; /* 有符号有符号 */else if(*

14、p)9) flag=2; /* 输入错输入错 */ / /* *从第二个字符开始,检查输入的字符串从第二个字符开始,检查输入的字符串* */ / p+; while(*p & flag!=2) /*字符串未结束且前一字符是正确字符字符串未结束且前一字符是正确字符*/ if( (*p)9 ) flag=2; /*不是不是09则错则错*/ p+; if(flag=2) / /* *输入有误输入有误* */ / printf(input error!n); else if(flag=0) / /* *无符号位无符号位* */ / count=p-number; else count=p-number

15、-1; / /* *有符号位,减有符号位,减1 1* */ / printf(count of numbers :%dn,count); 6.3 指针与数组指针与数组q数组名数组名是表示数组首地址的是表示数组首地址的地址常量地址常量 a &a0因而,因而,数组名数组名就是一个常量指针。就是一个常量指针。q对数组元素的引用:对数组元素的引用:v下标方法:通过下标计算元素地址下标方法:通过下标计算元素地址 特点:表达清晰易读特点:表达清晰易读v指针方法:用指针直接指向元素指针方法:用指针直接指向元素 特点:执行效率高特点:执行效率高用指针访问数组元素用指针访问数组元素q定义指向数组的指针变量定义指

16、向数组的指针变量例例: int a10; int *ip; ip=a; ip=&a0;q引用指针,访问数组元素引用指针,访问数组元素例:例:*(ip+5)=10; *(a+5)=10; a5=10;q移动指针,移动指针,访问数组元素,执行效率高访问数组元素,执行效率高例:例:*(+ip)=10; *(ip+1)=10;/指针是否发生变化指针是否发生变化*(+a)=10; / 错误,错误,a是指针常量,不可修改是指针常量,不可修改数组元素表示方法数组元素表示方法int a10, *p=a; 则则:ai pi *(p+i) *(a+i)pp+9p+1p+2*p*(p+1)*(p+2)*(p+9)2

17、7468.a &a0a+9 &a9a+1 &a1a+2 &a2地址表示地址表示元素表示元素表示下标法下标法a0a1a2a9*a*(a+1)*(a+2)*(a+9)p0p1p2p9指针法指针法例例1:用指针访问数组:用指针访问数组q引用指针,访问数组元素引用指针,访问数组元素void main() int a10, *p, i; p=a; /*使用前先赋值使用前先赋值*/ for(i=0; i10; i+) scanf(“%d”, p+i); /* scanf(“%d”, &ai); */ printf(“n”); for(i=0; i10; i+)printf(“%d”, *(p+i); /*

18、 printf(“%d”, ai); */例例2:用指针访问数组:用指针访问数组q移动指针,访问数组元素移动指针,访问数组元素void main() int a10, *p, i; p=a; for(i=0; i10; i+) scanf(“%d”, p+); /* 连续访问时,移动指针可提高执行效率连续访问时,移动指针可提高执行效率*/ printf(“n”); /*p成为野指针成为野指针*/ for(p=a, i=0; i10; i+) /*为为p重赋初值重赋初值*/ printf(“%d”, *(p+); /*移动指针访问移动指针访问*/a0a1a8a9P结束结束P初始初始p重赋重赋初值

19、初值用指针访问字符串用指针访问字符串q字符串指针是一个字符串指针是一个字符型指针变量字符型指针变量,其值,其值为字符串的起始地址。为字符串的起始地址。q用字符串指针可以更灵活有效地访问字符用字符串指针可以更灵活有效地访问字符串。串。q字符串指针的定义:字符串指针的定义: 例:例:char *str_p=Hello!; /*定义字符串指针定义字符串指针 str_p,指向字符串常量,指向字符串常量“Hello”的首地址的首地址*/ 例:例:char str=Hello!; char *str_p=str; /*定义字符串指针定义字符串指针str_p, 指向字符串变量(字符数组)指向字符串变量(字符

20、数组)str的首地址的首地址*/字符指针与字符数组比较字符指针与字符数组比较q定义定义vchar *p; 编译系统为编译系统为p分配分配1个地址类型的存个地址类型的存储单元,储单元,p是指针变量;是指针变量;vchar str20; 编译系统为编译系统为str分配分配20个字符型存个字符型存储单元储单元; str是地址常量;是地址常量;q初始化初始化vchar str20 =“Hello!”; 建立字符数组建立字符数组str并赋并赋初值,该数组可读可写;初值,该数组可读可写;vchar *p =“Hello!”; 建立字符串指针建立字符串指针p,并将字,并将字符串常量的首地址赋给符串常量的首地

21、址赋给p, p指向的常量目标可指向的常量目标可读不可写;读不可写;vchar str20, *p=str; 建立建立str数组和数组和p指针,并指针,并将将str的首址赋给的首址赋给p,p指向的单元可读可写。指向的单元可读可写。q赋值赋值vchar str20 ; str=“Hello!”; ( ) 字符数组只能字符数组只能逐个元素赋值逐个元素赋值vchar str20; str0=H; ( )vchar *p; p=“Hello!”; ( ) 将将p指向字符串常量指向字符串常量vchar *p; p0 = H; ( ) p为野指针为野指针vchar *p=“I love China!”; p

22、0= H; ( ) p指向指向字符串常量,不可修改字符串常量,不可修改vchar str20, *p; p=str; p0= H; ( ) p指向字指向字符数组,可修改符数组,可修改vchar str20, *p=str;* +p = e; ( ) 指针可移指针可移动动vchar str20; *+str=e; ( ) 指针常量不可修指针常量不可修改改字符指针与字符数组比较字符指针与字符数组比较例:字符串输出例:字符串输出#includevoid main( ) char *p=I am a student.;int i;printf(%sn, p); for(i=0; pi!=0; i+)

23、printf (%c, pi); printf(n); p+=5; /*p向后移动向后移动5个数据单位个数据单位*/printf(%sn, p );输出输出: I am a student. I am a student. a student.pi=*(p+i)p未移动未移动指针数组指针数组q指针数组指针数组:由同类型的指针变量为元素构:由同类型的指针变量为元素构成的数组。成的数组。q定义:定义:类型说明符类型说明符 *数组名数组名常量表达式常量表达式 例如:例如:float *p_num10; 定义了一个由定义了一个由10个指向个指向float型变量的指针型变量的指针构成的数组。构成的数组。

24、q指针数组的初始化指针数组的初始化 char *name5=Li,Liu,Chen;例:用指针数组表达多个字符串例:用指针数组表达多个字符串char *name5=Li,Liu,Chen;name0name1name2name3name4char *name5LNULLNULLi0L i0unC h0e指针数组应用举例指针数组应用举例q指针数组常用于处理二维数组或多个字符指针数组常用于处理二维数组或多个字符串串q例:利用指针数组显示菜单。例:利用指针数组显示菜单。#include void main() char *menu5=1 input,2 copy,3 move,4 delete,5

25、exit; int i; for(i=0; i5; i+) printf(%sn, menui); 输出:输出:1 input 2 copy 3 move 4 delete 5 exit例:指针数组与二维数组。例:指针数组与二维数组。main( )main( )intint a32=1,2,3,4,5,6; a32=1,2,3,4,5,6;intint * *p3,i;p3,i;for(ifor(i=0;i3;i+) =0;i3;i+) pi=ai pi=ai; ; / /* *aiai 为一维数组名,为一维数组名,pipi 为指针为指针* */ / printf(“%2d”, printf(

26、“%2d”,* *pipi); ); / /* * * *pipi 为第为第i i行第一个元素的值行第一个元素的值* */ / 打印结果:打印结果:1 3 51 3 5指针数组与指向数组的指针指针数组与指向数组的指针qfloat *p10 的优先级比的优先级比*高,所以高,所以p10首先确定首先确定p是数组,数组元素的类型为是数组,数组元素的类型为float *,即,即p的每个元素的每个元素pi都是指向实型数据的指针都是指向实型数据的指针变量。变量。qfloat (*p)10 ( )的优先级最高,所以的优先级最高,所以(*p)首先确定首先确定p是是一个指针变量一个指针变量,它的类型为,它的类型

27、为float 10,即即p是指向一个长度为是指向一个长度为10的实型数组的指的实型数组的指针,针,p+1则向后移动则向后移动整个数组的长度整个数组的长度。6.4 指针与函数指针与函数q指针与函数的关系:指针与函数的关系:v指针作为函数的参数指针作为函数的参数v数组名作为函数的参数数组名作为函数的参数v指针作为函数的返回值指针作为函数的返回值v指向函数的指针指向函数的指针v命令行参数命令行参数指针作为函数的参数指针作为函数的参数q指针作为函数的参数,传递的是指针值。指针作为函数的参数,传递的是指针值。对指针本身来说,是对指针本身来说,是值传递值传递。对指针的。对指针的目标对象来说,是目标对象来说

28、,是地址传递地址传递。q特点:特点: v“双向双向”传递传递:函数调用时,将实参:函数调用时,将实参指针值复制给形参指针,使实参与形指针值复制给形参指针,使实参与形参指向同一目标变量。对形参指针对参指向同一目标变量。对形参指针对象的操作就是对实参指针对象的操作。象的操作就是对实参指针对象的操作。v可传递复杂的数据可传递复杂的数据:传递的指针可以:传递的指针可以是任何复杂数据结构的是任何复杂数据结构的首地址。首地址。例例: 数的交换数的交换1void swap(int x, int y) int temp; temp=x; x=y; y=temp; return;void main() int

29、a=5, b=9; swap(a,b); printf(%d,%dn, a,b);.20002008200A2002200420065a b(main)9 temp y x(swap)595 95是是a,b的的值传递值传递,不能达到交换目的。输出:,不能达到交换目的。输出:5, 9 参数传递:参数传递:x=a; y=b;例例: 数的交换数的交换2void swap(int *p1, int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; return;void main() int a=5, b=9; swap(&a, &b); printf(%d,%d

30、n,a,b);是是a, b的的地址传递地址传递,对形参指针对象的操作,对形参指针对象的操作就是对实参指针对象的操作。输出:就是对实参指针对象的操作。输出:9, 5.20002008200A200220042006200C200E2010.20002002(swap)指针指针p1指针指针p2temp59a b(main)595参数传递:参数传递:p1=&a; p2=&b;例例: 数的交换数的交换3void swap(int *p1, int *p2) int *p; p=p1; p1=p2; p2=p; return;void main() int a=5, b=9; swap(&a, &b);

31、 printf(%d,%dn,a,b);实参与形参是实参与形参是值传递值传递。因而,对。因而,对形参本身形参本身的的修改不影响实参。输出:修改不影响实参。输出:5, 9 .20002008200A200220042006200C200E2010.20002002(swap)指针指针p1指针指针p2指针指针p59a b(main)200020022000参数传递:参数传递:p1=&a; p2=&b; void display(char *q) char s=teacher.; printf(%sn, q); *(q+8)=0; / /* *修改形参字符串,即修改形参字符串,即pp被修改被修改*

32、*/ / printf(%s, q); q=s; / /* *修改形参指针,实参指针值不变修改形参指针,实参指针值不变* */ / printf(%sn, q); return;void main() char p=He is a student.; display(p); printf(%sn, p); / /* *实参字符串改变实参字符串改变* */ /输出:输出:He is a student. He is a teacher. He is a例:字符串显示例:字符串显示数组名作为函数参数数组名作为函数参数q函数之间传递数组时,传递的是数组的函数之间传递数组时,传递的是数组的首地址,是首

33、地址,是地址传递地址传递。实参数组和形参。实参数组和形参数组共占同一段内存区域。对形参数组数组共占同一段内存区域。对形参数组的修改就是对实参数组的修改。的修改就是对实参数组的修改。q数组的首地址可以用指针表示,也可以数组的首地址可以用指针表示,也可以用数组名表示。因而形参与实参可以有用数组名表示。因而形参与实参可以有四种组合情况四种组合情况:数组数组数组数组指针指针数组数组数组数组指针指针指针指针指针指针void inv(int x, int n) int temp, i, m=(n-1)/2; for(i=0; i=m; i+) temp=xi; xi=xn-1-i; xn-1-i=temp

34、; void main() int i, a10=1,2,3,4,5,6,7,8,9,10; inv(a,10); for(i=0;i10;i+) printf(%d,ai);例:求数组逆转例:求数组逆转1形参用数组,实参用数形参用数组,实参用数组名,调用时执行组名,调用时执行参数参数传递传递:int *x=a; int n=10;注意:形参注意:形参int x是作是作为指针为指针int *x处理的。处理的。void inv(int *x, int n) int temp,*i,*j; for(i=x, j=x+n-1; ij; i+, j-) temp=*i; *i=*j; *j=temp;

35、 void main() int i, a10=1,2,3,4,5,6,7,8,9,10; inv(a, 10); for(i=0; i10; i+) printf(%d,ai);形参用指针变形参用指针变量量,实参用数实参用数组名,调用时组名,调用时执行参数传递:执行参数传递:int *x=a; int n=10;例:求数组逆转例:求数组逆转2 2void inv(int x, int n) int temp, i, m=(n-1)/2; for(i=0; i=m; i+) temp=xi; xi=xn-1-i; xn-1-i=temp;void main() int i,a10=1,2,3,

36、4,5,6,7,8,9,10; int *p=a; inv(p,10); for(p=a; pa+10; p+) printf(%d,*p);形参用数组形参用数组,实参用指针,实参用指针,调用时执行参调用时执行参数传递:数传递:int *x=p; int n=10;例:求数组逆转例:求数组逆转3 3void inv(int *x, int n) int temp,*i,*j; for(i=x, j=x+n-1; ij; i+, j-) temp=*i; *i=*j; *j=temp; void main() int i,a10=1,2,3,4,5,6,7,8,9,10; int *p=a; i

37、nv(p,10); for(p=a; pa+10; p+) printf(%d,*p);形参用指针形参用指针,实参用指针,实参用指针,调用时执行参调用时执行参数传递:数传递:int *x=p; int n=10;例:求数组逆转例:求数组逆转4#includevoid constr_a(char str1, char str2, char str3)int i=0, j=0;while(str1i!=0) str3i=str1i; i+;while(str2j!=0) str3i+j=str2j; j+;str3i+j=0;例:合并两个字符串例:合并两个字符串void constr_p(char

38、 *str1, char *str2, char *str3) while(*str1) *str3+ = *str1+;while(*str2) *str3+ = *str2+;*str3=0;void main() char s1=Happy;char s2= New Year!;char s320;constr_a(s1,s2,s3);puts(s3);constr_p(s1,s2,s3);puts(s3);输出:输出:Happy New Year! Happy New Year!函数的返回值为指针函数的返回值为指针q函数的返回值可以是函数的返回值可以是int型、型、float型、型、c

39、har型,也可以是一个指针类型。型,也可以是一个指针类型。q定义格式:定义格式:函数类型函数类型 *函数名函数名(形参表形参表) 例:例:int *func() int *p; return(p); 函数函数func返回一个指向整型数据的指针。返回一个指向整型数据的指针。例:显示菜单项内容例:显示菜单项内容#include /*定义菜单为全局字符指针数组定义菜单为全局字符指针数组menu*/char *menu5=1 input,2 copy,3 move,4 delete,5 exit ;/*根据菜单号返回菜单项字符串根据菜单号返回菜单项字符串,为指针数组元素为指针数组元素*/char *

40、menu_item(int i) if (i4) return NULL; else return (menui); void main() char * item; int i, number; for(i=0; i5; i+) printf(%sn, menui); printf(“Please input (1-5):); scanf(%d,&number); item=menu_item(number-1); /*返回值为指针返回值为指针*/ if(item=NULL) printf(“Input error!n); else printf(“Your select is:%sn,it

41、em);指向函数的指针指向函数的指针q函数指针的概念:函数指针的概念: 一个函数在编译时,被一个函数在编译时,被分配了一个分配了一个入口地址入口地址(第一条指令的地(第一条指令的地址),这个地址就称为该函数的指针。址),这个地址就称为该函数的指针。q可以用一个指针变量指向一个函数,然后可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数。通过该指针变量调用此函数。q函数指针的定义、赋值与调用:函数指针的定义、赋值与调用:定义:定义:函数类型函数类型 (*指针变量指针变量)( );赋值:赋值:指向函数的指针变量函数名指向函数的指针变量函数名;调用:调用:(*函数指针变量函数指针变量)(实

42、参表实参表);q例:例: int max(int x,int y)void main()int (*fp)( ); /*定义定义*/ int a=0,b=5,c; fp=max; /*赋值赋值*/ c=(*fp)(a,b); /*调用调用*/例例: 求定积分求定积分q求以下函数的定积分:求以下函数的定积分: y1= 10 (1+x2)dx y2= 20 (1+x+x2+x3)dx y3= 20 x/(1+x2)dxq用梯形法求定积分(见上图)。用梯形法求定积分(见上图)。s=(f(a)+f(a+h)h/2+(f(a+h)+f(a+2h)h/2+.+(f(a+(n-1)h)+f(b)h/2 =(

43、 f(a)/2 +f(a+h)+f(a+2h)+f(a+(n-1)h)+ f(b)/2 )h f(a)+f(b)h/2+hihafni11)(q编写一个求定积分的通用函数编写一个求定积分的通用函数integral。它用。它用函数指针的方式调用被积函数,求函数值。函数指针的方式调用被积函数,求函数值。#include/ /* *被积函数被积函数* */ /float f1(float x) return (1+x*x); float f2( float x) return(1+x+x*x+x*x*x);float f3( float x) return(x/(1+(x*x);/*通用积分函数通用

44、积分函数。形参形参fun、a、b分别表示分别表示 */*定积分的函数名和积分上下限。定积分的函数名和积分上下限。 */float integral(float (*fun)(float),float a,float b) float s, h, y; int n, i; s=(*fun)(a)+(*fun)(b)/2.0;/;/* *调用调用funfun所指向所指向的函数的函数* */ / n=100; h=(b-a)/n; for(i=1;itype file1.ctype命令命令type的参数的参数带参数的带参数的main函数函数q一般格式:一般格式: void main(int argc

45、, char *argv ) vargc:命令及参数的个数:命令及参数的个数vargv:指针数组,存放命令及参数的字符串首:指针数组,存放命令及参数的字符串首址。其中:址。其中: argv0为为main所在的可执行文件名所在的可执行文件名字符串的首字符串的首地址地址; argv1 argvargc-1为命令行各参数字符串的为命令行各参数字符串的首地址;首地址;q命令行参数传递:系统启动程序执行时,调用命令行参数传递:系统启动程序执行时,调用main函数,并将命令行实参传递给函数,并将命令行实参传递给main的形参。的形参。q例如:命令行为例如:命令行为 copy file1.c file2.c

46、 则在执行则在执行copy命令时,其命令时,其main函数的形函数的形参被赋值如下:参被赋值如下: argc=3 argv0= copy /*不是不是copy.exe*/ argv1= file1.c argv2= file2.cargv0argv1argv2file2.ccopyfile1.cargv3argc命令行参数举例命令行参数举例q编写程序,显示命令行上所有的命令及参编写程序,显示命令行上所有的命令及参数,并统计其个数。数,并统计其个数。方法:执行该程序时,键入方法:执行该程序时,键入可执行文件可执行文件名名+ +参数参数,程序将,程序将输入的字符串个数输入的字符串个数和和各字符串的首地址各字符串的首地址作为实际参数传递作为实际参数传递给给mainmain函数的函数的argcargc和和 * *argvargv ,在在mainmain函数中将函数中将argcargc及及argvargv的内容输出就得到的内容输出就得到了命令行上所有的命令及参数的统计了命令行上所有的命令及参数的统计个数和对应的字符串。个数和对应的字符串。order.cpp 编译连接后生成可执行文件编译连接后生成可执行文件order.exe#includestdio.hvoid mai

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论