《《指针和函数》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《指针和函数》PPT课件.ppt(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第1313讲讲 指针和函数指针和函数第第1313讲讲 指针和函数指针和函数本讲主要内容本讲主要内容n指针作为函数的参数指针作为函数的参数u简单指针变量作函数参数简单指针变量作函数参数u指向数组的指针作函数的参数指向数组的指针作函数的参数u字符串指针作函数的参数字符串指针作函数的参数u指针数组作函数的参数指针数组作函数的参数u带参数的带参数的main()函数函数n指针函数和指向函数的指针变量指针函数和指向函数的指针变量n动态内存分配函数简介动态内存分配函数简介第第1313讲讲 指针和函数指针和函数n教学目标教学目标u熟熟练练掌掌握握用用简简单单指指针针变变量量作作函函数数的的参参数数时时函函数
2、数的的定定义义和和调用方法。调用方法。u明明确确数数组组指指针针作作函函数数参参数数和和字字符符串串指指针针作作函函数数参参数数的的异异同,能正确定义和调用字符串指针作参数的函数。同,能正确定义和调用字符串指针作参数的函数。u熟悉指针数组作参数的函数,了解它的主要用途。熟悉指针数组作参数的函数,了解它的主要用途。u了了解解带带参参数数main()函函数数的的特特点点,掌掌握握带带参参数数main()函函数数中各个参数的意义,学会带参数中各个参数的意义,学会带参数main()函数的设计方法。函数的设计方法。u了解指针函数的定义方法及其应用。了解指针函数的定义方法及其应用。u了了解解动动态态内内存
3、存管管理理的的概概念念及及意意义义,熟熟悉悉动动态态内内存存管管理理函函数。数。一、指针作为函数的参数一、指针作为函数的参数 指针可以指向任何类型的数据,因此指针可以指向任何类型的数据,因此通过指针能够实现任何类型的数据处通过指针能够实现任何类型的数据处理。函数使用指针参数,就可以使函理。函数使用指针参数,就可以使函数处理各种类型的数据。与基本数据数处理各种类型的数据。与基本数据类型的变量作函数参数的最大区别是,类型的变量作函数参数的最大区别是,在函数间传递的不是变量的数值,而在函数间传递的不是变量的数值,而是变量的地址,这样可以通过函数直是变量的地址,这样可以通过函数直接处理实参指针指向的数
4、据。接处理实参指针指向的数据。一、指针作为函数的参数一、指针作为函数的参数 n简单指针变量作函数参数简单指针变量作函数参数 例例12-1用用swap()函数交换两个变量的值。函数交换两个变量的值。void swap(int*p1,int*p2)int temp;temp=*p1;*p1=*p2;*p2=temp;main()int x,y;scanf(%d,%d,&x,&y);if(xy)swap(&x,&y);printf(%d,%dn,x,y);一、指针作为函数的参数一、指针作为函数的参数 n指向数组的指针作函数的参数指向数组的指针作函数的参数 例例12-2 求一维数组的最大元素值。求一维
5、数组的最大元素值。我们用三个函数实现这个程序:我们用三个函数实现这个程序:用输入函数用输入函数input()建立数组;建立数组;用用max_a()函数求最大值;函数求最大值;用用main()函数作为主调函数。函数作为主调函数。为了方便对函数编写,先假定数组长度为为了方便对函数编写,先假定数组长度为n,指针指针p指向该数组。指向该数组。一、指针作为函数的参数一、指针作为函数的参数 void input(int*p,int n)int i;for(i=0;in;i+)scanf(%d,p+i);return;int max_a(int*p,int n)int i,max=*p;for(i=1;im
6、ax)max=*(p+i);return(max);main()int a10;input(a,10);printf(MAX=%dn,max_a(a,10);一、指针作为函数的参数一、指针作为函数的参数 n例例12-3 利用一维数组的排序函数对数组排序。利用一维数组的排序函数对数组排序。void p_sort(int*,int);void output(int*,int);main()int a10=3,-5,8,16,7,19,11,6,17,5;p_sort(a,10);printf(result:);output(a,10);void p_sort(int*p,int n)int i,t
7、emp,*q;for(i=1;in;i+)for(q=p;q*(q+1)temp=*q;*q=*(q+1);*(q+1)=temp;void output(int*p,int n)int*q;for(q=p;qp+n;q+)printf(%d ,*q);printf(n);一、指针作为函数的参数一、指针作为函数的参数 n字符串指针作函数的参数字符串指针作函数的参数#include stdio.hmain()void copy_s(char*,char*);char a20,b30;gets(a);copy_s(a,b);puts(b);void copy_s(char*str1,char*st
8、r2)while(*str2=*str1)!=0)str1+;str2+;例例12-5 用用字字符符串串指指针针作作函函数数参参数数,将将输输入入的的一一个个字字符符串串复复制制到到另另一一个个字字符符串中。串中。一、指针作为函数的参数一、指针作为函数的参数 n指针数组作函数的参数指针数组作函数的参数 例例12-7将一组字符串按字典顺序排序后输出。将一组字符串按字典顺序排序后输出。void string_sort(char*string,int n)char*temp;int i,j;for(i=1;in;i+)for(j=0;j0)temp=string j;string j=string
9、j+1;string j+1=temp;void string_out(char*string,int n)int i;for(i=0;in;i+)printf(%s ,string i);#include stdio.h#include string.hmain()void string_sort(char*,int);void string_out(char*,int);char*days7=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;string_sort(days,7);string_out(days,7);一、指针
10、作为函数的参数一、指针作为函数的参数 n使用参数的使用参数的main()main()函数函数 指指针针数数组组的的一一个个重重要要应应用用是是作作为为main()函函数数的的形形参参,带带参参数数的的main函数的一般形式如下:函数的一般形式如下:main(int argc,char*argv)其其中中:argc表表示示命命令令行行参参数数个个数数,argv是是指指向向命命令令行行参参数数的的指指针数组。针数组。在在操操作作系系统统下下运运行行程程序序时时,可可以以以以命命令令行行参参数数形形式式向向main()函数传递参数。命令行参数的一般形式是:函数传递参数。命令行参数的一般形式是:运行文
11、件名参数运行文件名参数1参数参数2参数参数n运行文件名和参数之间、各个参数之间要用一个空格分隔。运行文件名和参数之间、各个参数之间要用一个空格分隔。指指针针argv0指指向向的的字字符符串串是是运运行行文文件件名名,argv1指指向向的的字字符符串串是是命命令令行行参参数数1,argv2 指指向向的的字字符符串串是是命命令令行行参参数数2,等等。,等等。一、指针作为函数的参数一、指针作为函数的参数 n例例12-8 带参数的带参数的main()main()函数举例函数举例#include stdio.hmain(int argc,char*argv)int i;printf(argc=%dn,a
12、rgc);for(i=1;iargc;i+)printf(%sn,argvi);二、指针函数和指向函数的指针变量二、指针函数和指向函数的指针变量 n 指针函数指针函数 函函数数返返回回值值是是指指针针类类型型的的函函数数称称为为指指针针函函数数。指指针针函函数数的的定定义义与与其其他他函函数数有有一一定定区区别别,需需要要在在函函数数名名前前使使用用“*”符。一般格式如下:符。一般格式如下:数据类型数据类型 *函数名函数名(形参表形参表)函数体函数体二、指针函数和指向函数的指针变量二、指针函数和指向函数的指针变量 n例例12-9将将一一组组字字符符串串中中长长度度最最大大的的找找出出来来,并并
13、输输出出这这个个字字符符串。串。char*max_lenth(char*string,int n)int i,posion,max_l;posion=0;max_l=strlen(string0);for(i=1;imax_l)max_l=strlen(stringi);posion=i;return(stringposion);#include stdio.h#include string.hmain()char*max_lenth(char*,int);char*p_string4=Sydney2000,Beijing2008,Athens1996,Korea1992;char*p;p=m
14、ax_lenth(p_string,4)puts(p);二、指针函数和指向函数的指针变量二、指针函数和指向函数的指针变量 n 指向函数的指针变量指向函数的指针变量 在在定定义义一一个个函函数数之之后后,编编译译系系统统为为每每个个函函数数确确定定一一个个入入口口地地址址,当当调调用用该该函函数数的的时时候候,系系统统会会从从这这个个“入入口口地地址址”开开始始执执行行该该函函数数。存存放放函函数数的的入入口口地址的变量就是一个指向函数的指针变量,简称函数的指针。地址的变量就是一个指向函数的指针变量,简称函数的指针。函数的指针的定义方式是:函数的指针的定义方式是:数据类型数据类型(*(*指针变量
15、名指针变量名)()()和和变变量量的的指指针针一一样样,函函数数的的指指针针也也必必须须赋赋初初值值后后才才能能指指向向具具体体的的函函数数。由由于于函函数数名名代代表表了了该该函函数数的的入入口口地地址址,因因此此,通通常常直直接接用用函函数数名名为为函函数数指指针针赋赋值,即:值,即:函数指针名函数指针名=函数名函数名例如:例如:double fun();/*函数说明函数说明*/double(*f)();/*函数指针说明函数指针说明*/f=fun;/*f指向指向fun函数函数*/三、动态内存分配函数简介三、动态内存分配函数简介 n 动态内存分配动态内存分配 在在前前面面的的程程序序设设计计
16、中中,存存在在一一个个问问题题,就就是是在在编编写写程程序序时时,因因为为无无法法确确定定要要处处理理数数据据的的规规模模,如如字字符符串串的的长长度度、数数值值数数据据的的个个数数等等,为为保保证证在在数数据据规规模模足足够够大大时时也也能能进进行行处处理理,在在定定义义变变量量时时就就为为它它说说明明一一个个特特别别大大的的空空间间,而而在在实实际际运运行行时时,可可能能只只需需要要这这空空间间的的很很小小一一部部分分,也也有有可可能能给给出出的的空空间间还还不不够够大大。这这对对内内存存资资源源利利用用和和程程序序设设计计都都是是不不利利的的。我我们们希希望望,计计算算机机能能按按需需分
17、分配配内内存存,在在运运行行时时需需要要多多大大的的空空间间就就分分配配多多大的空间,这样就能完全解决上面提到的问题。大的空间,这样就能完全解决上面提到的问题。上上面面提提出出的的问问题题,实实际际上上是是计计算算机机内内存存的的动动态态管管理理问问题题。C语言的动态内存管理函数,实现了动态内存管理。语言的动态内存管理函数,实现了动态内存管理。三、动态内存分配函数简介三、动态内存分配函数简介 n 动态内存管理函数动态内存管理函数 1.malloc()函数函数 2.2.其函数原型为:其函数原型为:3.3.void*malloc(unsigned int size);void*malloc(uns
18、igned int size);4.其其功功能能是是:分分配配一一块块长长度度为为size字字节节的的连连续续空空间间,并并将将该该空空间间的的首首地地址址作作为为函函数数的的返返回回值值。如如果果函函数数没没有有成成功功执执行行,返返回回值值为为空空指指针针(NULL或或0)。由由于于返返回回的的指指针针的的基基类类型型为为void,应应该该通通过过显显式式类类型型转转换换后后才才能能存存入入其其他他基基类类型型的的指指针变量中,否则会有警告提示。针变量中,否则会有警告提示。5.例如:例如:6.int*p;7.p=(int*)malloc(sizeof(int);三、动态内存分配函数简介三、
19、动态内存分配函数简介 n 动态内存管理函数动态内存管理函数 1.2free()函数函数2.2.其函数原型为:其函数原型为:3.void free(void*block);4.4.其其功功能能是是:释释放放以以前前分分配配给给指指针针变变量量block的的动动态态空间,但指针变量空间,但指针变量block不会自动变成空指针。不会自动变成空指针。三、动态内存分配函数简介三、动态内存分配函数简介 n 动态内存管理函数动态内存管理函数 1.3.calloc()函数函数 2.2.其函数原型为:其函数原型为:3.void*calloc(unsigned n,unsigned size);4.其其功功能能是
20、是:以以size为为单单位位大大小小共共分分配配n*size个个字字节节的的连连续续空空间间,并并将将该该空空间间的的首首地地址址作作为为函函数数的的返返回回值值。如如果果函函数数没没有有成成功功执执行行,返返回回值值为为空空指指针针(NULL或或0)。该该函函数数比比malloc函函数数方方便便之之处处在在于于,当当动动态态分分配配数数组组空空间间时时,malloc函函数数必必须须手手工工计计算算出出数数组组的的总总字字节节数数,而而calloc函函数不用计算。数不用计算。5.例如:例如:6.int*p;7.p=(int*)calloc(10,sizeof(int);指针和函数指针和函数-小
21、结小结1 1指指指指针针针针作作作作为为为为函函函函数数数数的的的的参参参参数数数数时时时时,在在在在函函函函数数数数间间间间传传传传递递递递的的的的是是是是变变变变量量量量的的的的地址。地址。地址。地址。2 2简简简简单单单单指指指指针针针针变变变变量量量量作作作作函函函函数数数数参参参参数数数数,是是是是指指指指针针针针作作作作函函函函数数数数参参参参数数数数中中中中最最最最基基基基本本本本的的的的内内内内容容容容,它它它它的的的的作作作作用用用用是是是是实实实实现现现现一一一一个个个个简简简简单单单单变变变变量量量量的的的的地地地地址址址址在函数中的传递。在函数中的传递。在函数中的传递。
22、在函数中的传递。3 3数数数数组组组组名名名名是是是是数数数数组组组组的的的的地地地地址址址址,与与与与指指指指针针针针具具具具有有有有一一一一些些些些相相相相同同同同的的的的性性性性质质质质,用用用用数数数数组组组组指指指指针针针针作作作作函函函函数数数数参参参参数数数数和和和和用用用用数数数数组组组组名名名名作作作作函函函函数数数数参参参参数数数数有有有有很很很很多相同之处。多相同之处。多相同之处。多相同之处。4 4指指指指针针针针数数数数组组组组的的的的元元元元素素素素是是是是指指指指针针针针变变变变量量量量,用用用用指指指指针针针针数数数数组组组组可可可可以以以以方方方方便便便便地地地
23、地实实实实现现现现对对对对一一一一组组组组字字字字符符符符串串串串的的的的处处处处理理理理。用用用用指指指指针针针针数数数数组组组组作作作作函函函函数数数数参参参参数数数数,可可可可以以以以实实实实现现现现多多多多字字字字符符符符串串串串处处处处理理理理的的的的通通通通用用用用函函函函数数数数。指指指指针针针针数数数数组组组组的一个重要应用是作为的一个重要应用是作为的一个重要应用是作为的一个重要应用是作为main()main()函数的形参。函数的形参。函数的形参。函数的形参。指针和函数指针和函数-小结小结5 5字字字字符符符符串串串串指指指指针针针针作作作作函函函函数数数数的的的的参参参参数数
24、数数与与与与数数数数组组组组指指指指针针针针作作作作函函函函数数数数参参参参数数数数没没没没有有有有本本本本质质质质的的的的区区区区别别别别,函函函函数数数数间间间间传传传传递递递递的的的的都都都都是是是是地地地地址址址址值值值值,所所所所不不不不同同同同的仅是指针指向对象的类型不同而已。的仅是指针指向对象的类型不同而已。的仅是指针指向对象的类型不同而已。的仅是指针指向对象的类型不同而已。6 6函函函函数数数数返返返返回回回回值值值值是是是是指指指指针针针针类类类类型型型型的的的的函函函函数数数数称称称称为为为为指指指指针针针针函函函函数数数数,使使使使用用用用指指指指针针针针函函函函数数数数
25、可可可可以以以以获获获获得得得得更更更更多多多多的的的的处处处处理理理理结结结结果果果果。需需需需要要要要特特特特别别别别特特特特别别别别注注注注意意意意的的的的是是是是,对对对对于于于于指指指指针针针针函函函函数数数数,用用用用returnreturn返返返返回回回回的的的的值值值值必必必必须须须须是一个指针值。是一个指针值。是一个指针值。是一个指针值。7 7动动动动态态态态内内内内存存存存管管管管理理理理的的的的目目目目的的的的是是是是为为为为了了了了实实实实现现现现动动动动态态态态存存存存储储储储。指指指指针针针针类类类类型型型型函函函函数数数数malloc()malloc()和和和和calloc()calloc()用用用用于于于于获获获获取取取取一一一一段段段段可可可可用用用用内内内内存存存存,函函函函数数数数值值值值为为为为内内内内存存存存段段段段的的的的首首首首地地地地址址址址,free()free()函函函函数数数数用用用用于于于于释释释释放放放放不不不不再再再再使使使使用用用用的的的的内内内内存存存存段段段段,这这这这些些些些函函函函数数数数在在在在链链链链表表表表操操操操作作作作中中中中有有有有广广广广泛泛泛泛应应应应用。用。用。用。