![山西财经大学C语言程序设计第6章指针和引用的课件_第1页](http://file4.renrendoc.com/view/8eeaff5c72ebd077aa108594fb9732db/8eeaff5c72ebd077aa108594fb9732db1.gif)
![山西财经大学C语言程序设计第6章指针和引用的课件_第2页](http://file4.renrendoc.com/view/8eeaff5c72ebd077aa108594fb9732db/8eeaff5c72ebd077aa108594fb9732db2.gif)
![山西财经大学C语言程序设计第6章指针和引用的课件_第3页](http://file4.renrendoc.com/view/8eeaff5c72ebd077aa108594fb9732db/8eeaff5c72ebd077aa108594fb9732db3.gif)
![山西财经大学C语言程序设计第6章指针和引用的课件_第4页](http://file4.renrendoc.com/view/8eeaff5c72ebd077aa108594fb9732db/8eeaff5c72ebd077aa108594fb9732db4.gif)
![山西财经大学C语言程序设计第6章指针和引用的课件_第5页](http://file4.renrendoc.com/view/8eeaff5c72ebd077aa108594fb9732db/8eeaff5c72ebd077aa108594fb9732db5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本章导读 指针是C 语言中的一个重要的概念,也是C 语言的一个重要特色。正确而灵活地运用它,可以有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;有效而方便地使用数组,能直接处理内存地址等,这对设计系统件是很必要的。掌握指针的应用,可以使程序简洁、紧凑、高效。每一个学习和使用C 语言的人,都应当深入地学习和掌握指针。可以说,不掌握指针就不掌握C的精华。 C语言程序设计 (Visual C+ 6.0环境)返回本书目录第6章 指针与引用本章主要知识点 (1) 关于指针的C程序实例 (2) 指针 (3)指针与数组 (4) 指针与函数(5) 多级指针与指针数组 (6) 内存管理 (7)引用
2、第6章 指针与引用 C语言程序设计 (Visual C+ 6.0环境)返回本章导读 6.2 指针 6.3 指针与数组 6.5 多级指针与指针数组 6.4 指针与函数 6.1 关于指针的C程序实例6.6 引用6.7 内存管理 C语言程序设计 (Visual C+ 6.0环境)返回本章目录6.1.1 C程序实例6.1 关于指针的C程序实例 C语言程序设计 (Visual C+ 6.0环境)返回本节目录2. C程序实例(2)1. C程序实例(1)6.1.1 C程序实例6.1.1 C程序实例(1) C语言程序设计 (Visual C+ 6.0环境)返回本节目录1.C程序实例1【例6.1】指针变量的定义
3、示例。 /*程序名为l5_1.cpp */*程序功能:验证指针变量的定义*/ main() int num_int=12, *p_int; /*定义一个指向int型数据的指针变量p_int */ float num_f=3.14, *p_f; /*定义一个指向float型数据的指针变量p_f */ char num_ch=p, *p_ch; /*定义一个指向char型数据的指针变量p_ch */ p_int=&num_int; /*取变量num_int的地址,赋值给p_int */ p_f=&num_f; /*取变量num_f的地址,赋值给p_f */ p_ch=&num_ch; /*取变量n
4、um_ch的地址,赋值给p_ch */ printf(“num_int=%d, *p_int=%dn”, num_int, *p_int); printf(“num_f=%4.2f, *p_f=%4.2fn”, num_f, *p_f); printf(“num_ch=%c, *p_ch=%cn”, num_ch, *p_ch); 程序运行结果:num_int=12, *p_int=12num_f=3.14, *p_f=3.14num_ch=p, *p_ch=p程序演示例6.1程序演示单击运行输入源程序弹出运行结果窗口返回例题返回本节目录6.1.1 C程序实例(2) C语言程序设计 (Visu
5、al C+ 6.0环境)2.C程序实例2【例6.2】输入2个整数,按升序(从小到大排序)输出。/*程序名为l5_2.cpp */*程序功能:使用指针变量求解2个整数的升序输出*/main() int num1,num2; int *num1_p=&num1, *num2_p=&num2, *pointer; printf(“Input the first number: ”); scanf(“%d”,num1_p); printf(“Input the second number: ”); scanf(“%d”,num2_p); printf(“num1=%d, num2=%dn”, num1
6、, num2); if( *num1_p *num2_p ) /*如果num1num2,则交换指针*/ pointer= num1_p; num1_p= num2_p; num2_p=pointer; printf(“min=%d, max=%dn”, *num1_p, *num2_p); 程序运行情况:Input the first number:9Input the second number:6num1=9, num2=6min=6, max=9返回本节目录程序演示例6.2程序演示单击运行输入源程序弹出运行结果窗口返回例题返回本节目录 C语言程序设计 (Visual C+ 6.0环境)返
7、回本章目录6.2.2 指向变量的指针变量6.2.1 地址和指针的概念6.2 指针 6.2.1 地址和指针的概念 C语言程序设计 (Visual C+ 6.0环境)1.内存地址内存中存储单元的编号2.变量地址系统分配给变量的内存单元的起始地址 (1)计算机硬件系统的内存储器中,拥有大量的存储单元(每个存储单元容量为字节)。为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的“地址”。每个存储单元都有一个惟一的地址。(2)在地址所标识的存储单元中存放数据。注意:内存单元的地址与内存单元中的数据是两个完全不同的概念。假设有这样一个程序:main() int num; scanf(%d,&n
8、um); printf(num=%dn, num); C编译程序编译到该变量定义语句时,将变量num 登录到“符号表”中。符号表的关键属性有两个:一是“标识符名(id)” ,二是该标识符在内存空间中的“地址(addr)” 。为描述方便,假设系统分配给变量num的2字节存储单元为 3000 和3001,则起始地址3000就是变量num在内存中的地址。返回本节目录6.2.1 地址和指针的概念 C语言程序设计 (Visual C+ 6.0环境)3.变量值的存取通过变量在内存中的地址进行系统执行“scanf(”%d“,&num);”和“printf(”num=%dn“, num);”时,存取变量num
9、值的方式可以有两种:(1)直接访问直接利用变量的地址进行存取 上例中scanf(“%d”,&num)的执行过程是这样的: 用变量名num作为索引值,检索符号表,找到变量num的起始地址3000;然后将键盘输入的值(假设为)送到内存单元3000和3001中。 printf(num=%dn,num)的执行过程,与scanf( )很相似: 首先找到变量num的起始地址3000,然后从3000和3001中取出其值,最后将它输出。 返回本节目录6.2.1 地址和指针的概念 C语言程序设计 (Visual C+ 6.0环境)(2)间接访问通过另一变量访问该变量的值 语言规定:在程序中可以定义一种特殊的变量
10、(称为指针变量),用来存放其它变量的地址。 例如,假设定义了这样一个指针变量num_pointer,它被分配到4000、4001单元,其值可通过赋值语句“num_pointer=num;”得到。此时,指针变量num_pointer的值就是变量num在内存中的起始地址3000。 【例5.2】中 printf(“min=%d, max=%dn”, *num1_p, *num2_p); 语句:通过指针变量,间接访问变量的值。返回本节目录6.2.2 指向变量的指针变量 C语言程序设计 (Visual C+ 6.0环境)返回本节目录1.指针与指针变量 (1)指针即地址 一个变量的地址称为该变量的指针。通
11、过变量的指针能够找到该变量。(2)指针变量专门用于存储其它变量地址的变量指针变量num_pointer的值就是变量num的地址。指针与指针变量的区别,就是变量值与变量的区别。(3)为表示指针变量和它指向的变量之间的关系,用指针运算符“*”表示。 例如,指针变量num_pointer与它所指向的变量num的关系,表示为:*num_pointer,即*num_pointer等价于变量num。因此,下面两个语句的作用相同:num=3; /*将3直接赋给变量num*/num_pointer=# /*使num_pointer指向num */*num_pointer=3; /*将3赋给指针变量nu
12、m_pointer所指向的变量*/6.2.2 指向变量的指针变量 C语言程序设计 (Visual C+ 6.0环境)返回本节目录2.指针变量的定义与应用【例6.1】 程序中头三行的变量定义语句指针变量的定义 与一般变量的定义相比,除变量名前多了一个星号“*” (指针变量的定义标识符)外,其余一样:数据类型 *指针变量, *指针变量2; 注意:此时的指针变量p_int、p_f、p_ch,并未指向某个具体的变量(称指针是悬空的)。使用悬空指针很容易破坏系统,导致系统瘫痪。【例6.1】中间三行的赋值语句取地址运算()取地址运算的格式: 变量例如,&num_int、&num_f、&num_ch的结果,
13、分别为变量num_int、num_f、num_ch的地址。注意:指针变量只能存放指针(地址),且只能是相同类型变量的地址。C语言中用NULL表示空指针。若有语句:p=NULL;则表示指针p为空,没有指向任何对象。 C语言程序设计 (Visual C+ 6.0环境)返回本章目录 6.3.2 通过指针引用数组元素6.3.1 指向数组元素的指针6.3 指针与数组6.3.3 数组名作函数参数6.3.4 指针与字符数组6.3.5 数组指针6.3.1 指向数组元素的指针 C语言程序设计 (Visual C+ 6.0环境) 返回本节目录指向数组的元素指针变量的定义,与指向普通变量的指针变量的定义方法一样例如
14、,int array10; ( 定义array为包含10个整型变量的数组) int *pointer (定义pointer为指向整型变量的指针变量)应当注意,如果数组为int 型,则指针变量亦应指向int 型。下面是对该指针赋值:pointer= &array0;把array0 元素的地址赋给指针变量pointer。也就是说,pointer 指向 array数组的第0号元素。C 语言规定数组名代表数组的首地址,也就是第一个元素的地址。因此,下面两个语句等价pointer= &array0; pointerarray;注意:数组名不代表整个数组,上述“pointerarray;”的作用是“把ar
15、ray数组的第一个元素的地址赋给指针变量pointer”而不是“把array数组各元素的值赋给pointer”。 6.3.2 通过指针引用数组元素 C语言程序设计 (Visual C+ 6.0环境)返回本节目录1 通过指针引用一维数组中的元素 如果有“int array10,*pointer=array;” ,则:(1)pointer+i和array+i都是数组元素arrayi的地址。 (2)*(pointer+i)和*(array+i)就是数组元素arrayi。(3)指向数组的指针变量,也可将其看作是数组名,因而可按下标法来使用。例如,pointeri等价于*(pointer+i)。注意:p
16、ointer+1指向数组的下一个元素,而不是简单地使指针变量pointer的值+1。其实际变化为pointer+1*size(size为一个元素占用的字节数)。例如,假设指针变量pointer的当前值为3000,则pointer+1为3000+1*2=3002,而不是3001。6.3.2 通过指针引用数组元素 C语言程序设计 (Visual C+ 6.0环境)返回本节目录【例6.3】 使用指向数组的指针变量来引用数组元素。/*程序名为l6_3.cpp */*程序功能:使用指向数组的指针变量来引用数组元素*/main() int array10, *pointer=array, i; print
17、f(“Input 10 numbers: ”); for(i=0; i10; i+) scanf(“%d”, pointer+i);/*使用指针变量来输入数组元素的值*/ printf(“array10: ”); for(i=0; i10; i+) printf(“%d ”, *(pointer+i);/*使用指向数组的指针变量输出数组*/ printf(“n”); 6.3.2 通过指针引用数组元素 C语言程序设计 (Visual C+ 6.0环境)返回本节目录程序运行情况:Input 10 numbers: 0 1 2 3 4 5 6 7 8 9array10: 0 1 2 3 4 5 6
18、7 8 9程序说明:程序中第3行和第6行的2个for语句,等价于下面的程序段:for(i=0; i10; i+,pointer+) scanf(“%d”,pointer);printf(“array10: ”);pointer=array; /*使pointer重新指向数组的第一个元素*/for(i=0; i10; i+,pointer+) printf(“%d”,*pointer); 6.3.2 通过指针引用数组元素 C语言程序设计 (Visual C+ 6.0环境)返回本节目录2 通过指针引用二维数组中的元素 在C语言中,二维数组是按行优先的规律转换为一维线性存放在内存中的,因此,可以通过
19、指针访问二维数组中的元素。 如果有:int aMN; 则将二维数组中的元素aij转换为一维线性地址的一般公式是: 线性地址aiMj 其中:a为数组的首地址, M和N分别为二维数组行和列的元素个数。 6.3.2 通过指针引用数组元素 C语言程序设计 (Visual C+ 6.0环境)返回本节目录【例6.4】:给定某年某月某日,将其转换成这一年的第几天并输出。 此题的算法很简单,若给定的月是i,则将1、2、3、i-1月的各月天数累加,再加上指定的日。但对于闰年,二月的天数29天,因此还要判定给定的年是否为闰年。为实现这一算法,需设置一张每月天数列表,给出每个月的天数,考虑闰年非闰年的情况,此表可设
20、置成一个2行13列的二维数组,其中第1行对应的每列(设112列有效)元素是平年各月的天数,第2行对应的是闰年每月的天数。程序中使用指针作为函数day_of_year的形式参数。/*程序名为l6_4.cpp */*程序功能:使用指向数组的指针变量来引用数组元素*/#include main( ) static int day_tab213=0,31,28,31,30,31,30,31,31,30,31,30,31,0,31,29,31,30,31,30,31,31,30,31,30,31 ;int y, m, d;scanf(%d%d%d, &y, &m, &d); 6.3.2 通过指针引用数组
21、元素 C语言程序设计 (Visual C+ 6.0环境)返回本节目录printf(%dn, day_of_year(day_tab,y,m,d) ); /* 实参为二维数组名 */day_of_year(day_tab,year,month,day)int *day_tab; /* 形式参数为指针 */int year, month, day; int i, j;i = (year%4=0&year%100!=0) | year%400=0;for ( j=1; jmonth; j+ )day += *( day_tab+i*13+j ); /* day_tab+i*13+j:对二维数组中元素
22、进行地址变换 */return(day); 由于语言对于二维数组中的元素在内存中是按行存放的,所以在函数day_of_year 中要使用公式day_tab+i*13+j计算main函数的day_tab中元素对应的地址。 6.3.3 数组名作函数参数 C语言程序设计 (Visual C+ 6.0环境)返回本节目录数组名可以用作函数的形参和实参。如:main ( ) int array10 ;f ( array , 10 ) f ( arr , n )int arr , n ; array 为实参数组名,arr 为形参数组名。 6.3.3 数组名作函数参数 C语言程序设计 (Visual C+ 6
23、.0环境)返回本节目录【例6.5】将数组a 中n 个整数按相反顺序存放 解此题的算法为:将a 0与an-1 对换,再将a1与an-2对换, ,直到将a(n-1)/2 与a n-int(n-1)/2) 对换。今用循环处理此问题,设两个“位置指示变量”i 和j , i 的初值为0 , j 的初值为n-1。将ai与aj 交换,然后使i 的值加1 , j 的值减1 ,再将ai与aj对换,直到i =(n-1)/2 为止。程序如下:程序名为l6_5.cppVoid inv(int x,int n) /*形参x是数组名*/ int temp,i,j,m=(n-1)/2; for(i=0;i=m;i+)j=n
24、-1-i;temp=xi;xiI=xj;xj=temp;return;main() int i,a10=3,7,9,11,0,6,7,5,4,2;for(i=0;i10;i+) 6.3.3 数组名作函数参数 C语言程序设计 (Visual C+ 6.0环境)返回本节目录printf(“%d,”,ai);printf(“n”);inv(a,10);for(i=0;i10;i+)printf(“%d,”,ai);printf(“n”);运行情况如下:3,8,11,0,5,9,4,7,10,2,2,10,7,4,9,5,0,11,8,3,程序说明: 主函数中数组名为 a ,赋以各元素初值。函数 in
25、v 中的形参数组名为 x ,在 inv 函数中不具体定义数组元素的个数,元素个数由形参变量 n 传入(今对应的实参值为 10 )。这样做可以增加函数的灵活性。即不必要求函数 inv 中的形参数组 x 和 main 函数中的实参数组 a 长度相同。如果在main函数中有函数调用语句:“ inv ( a , 10 )”,表示要求对 a 数组的前 10 个元素实行题目要求的颠倒排列。如果改为 “inv ( a , 5 )” ,则表示将 a 数组的前 5 个元素实行颠倒排列,此时,函数 inv 只处理 5 个数组元素。函数 inv 中的 m 是 i 值的上限,当 i m 时,则结束循环过程。 6.3.
26、3 数组名作函数参数 C语言程序设计 (Visual C+ 6.0环境)返回本节目录 小结: 引入指向数组的指针变量后,数组及指向数组的指针变量作函数参数时,可有种等价形式(本质上是一种,即指针数据作函数参数):(1)形参、实参都用数组名(2)形参、实参都用指针变量(3)形参用指针变量、实参用数组名(4)形参用数组名、实参用指针变量 6.3.4 指针与字符数组 C语言程序设计 (Visual C+ 6.0环境)返回本节目录1. 字符串的表示与引用在语言中,既可以用字符数组表示字符串,也可用字符指针变量来表示;引用时,既可以逐个字符引用,也可以整体引用。(1)逐个引用【例6.6】 使用字符指针变
27、量表示和引用字符串。/*程序名为l6_6.cpp /main() char *string=”I love Beijing.”; for(; *string!=0; string+) printf(“%c”, *string); printf(“n”); 程序运行结果: I love Beijing.程序说明:char *string=I love Beijing.;语句定义并初始化字符指针变量string:用串常量“I love Beijing.”的地址(由系统自动开辟、存储串常量的内存块的首地址)给string赋初值。 6.3.4 指针与字符数组 C语言程序设计 (Visual C+ 6.
28、0环境)返回本节目录(2)整体引用【例6.7】采取整体引用的办法,改写例5.9。/*程序名为l6_7.cpp */*程序功能:使用字符指针变量表示和引用字符串*/main() char *string=”I love Beijing.”; printf(“%sn”,string);程序说明:printf(“%sn”,string);语句 通过指向字符串的指针变量string,整体引用它所指向的字符串的原理:系统首先输出string指向的第一个字符,然后使string自动加,使之指向下一个字符;重复上述过程,直至遇到字符串结束标志。注意:其它类型的数组,是不能用数组名来一次性输出它的全部元素的,
29、只能逐个元素输出。 6.3.4 指针与字符数组 C语言程序设计 (Visual C+ 6.0环境)返回本节目录2.字符指针变量与字符数组之比较虽然用字符指针变量和字符数组都能实现字符串的存储和处理,但二者是有区别的,不能混为一谈。(1)存储内容不同。字符指针变量中存储的是字符串的首地址,而字符数组中存储的是字符串本身(数组的每个元素存放一个字符)。(2)赋值方式不同。对字符指针变量,可采用下面的赋值语句赋值: char *pointer; pointer=This is a example.;而字符数组,虽然可以在定义时初始化,但不能用赋值语句整体赋值。下面的用法是非法的: char char
30、_array20; char_array=This is a example.; /*非法用法*/(3)指针变量的值是可以改变的,字符指针变量也不例外; 6.3.4 指针与字符数组 C语言程序设计 (Visual C+ 6.0环境)返回本节目录3. 字符串指针作函数参数【例6.8】 用函数调用方式,实现字符串的复制。/*程序名为l6_8.cpp */*/*string_copy()函数:复制一个字符串*/ /*形参:字符指针str_from接收源串,字符指针 str_to存储目标串 */*返回值:无*/ /*/void string_copy(char *str_from, char *str
31、_to) int i=0; for(; (*(str_to+i)=*(str_from+i)!=0; i+) ; /*循环体为空语句*/ main() char array_str120=”I am a teacher.”; char array_str220; 6.3.4 指针与字符数组 C语言程序设计 (Visual C+ 6.0环境)返回本节目录string_copy(array_str1, array_str2) ; /*数组名作实参*/printf(“array_str2=%sn”, array_str2); 程序运行结果: I am a teacher.程序说明: for(; (*
32、(str_to+i)=*(str_from+i)!=0; i+) ; 语句的执行过程为:首先将源串中的当前字符,复制到目标串中;然后判断该字符(即赋值表达式的值)是否是结束标志。如果不是,则相对位置变量i的值增1,以便复制下一个字符;如果是结束标志,则结束循环。其特点是:先复制、后判断,循环结束前,结束标志已经复制。 6.3.5 数组指针 C语言程序设计 (Visual C+ 6.0环境)返回本节目录 我们上面介绍的指针都是指向某一类型的变量的,例如可以使一个指针p指向某一数组元素。如果p的值加1,则指向下一个元素,这样指针在处理一维数组时非常方便,但在处理二维数组时就不适合了。如果定义一个指
33、针p,让它指向一个包含n个元素的一维数组,且p的增值以一维数组的长度为单位,此时,如果指针P指向二维数组的某一行,则p+1就指向了该二维数组的下一行。在C+中,这样的指针被称为数组指针,使用数组指针可以很方便地处理二维数组。 数组指针的说明形式如下: 存储类型 数据类型 (*指针名)元素个数 例如,在程序中定义一个数组指针: int (*p)4; 它表明指针p指向的数组指针p指向一个一维数组,p的值就是该一维数组的首地址。在使用数组指针时,有两点一定要注意:(1) *p两侧的括号一定不要漏掉,如果写成*p4的形式,由于 的运算级别高,因此p先和4结合,是数组,然后再与前面的*结合,*p4是指针
34、数组。 6.3.5 数组指针 C语言程序设计 (Visual C+ 6.0环境)返回本节目录(2) p是一个行指针,它只能指向一个包含n个元素的一维数组,不能指向一维数组中的元素。【例6.9】:用数组指针处理二维数组。程序名为l6_9.cppmain()int a23=1,3,5,7,9,11;int (*p)3;int i,j;p=a;for(i=0;i2;i+) for(j=0;j *num2_p ) /* 即num1num2)*/ exchange(num1_p, num2_p); /*指针变量作实参*/ printf(“min=%d, max=%dn”, num1, num2); /*
35、输出排序后的num1和num2的值*/程序运行情况:Input the first number:9Input the second number:6num1=9, num2=6min=6, max=9程序说明:形参指针变量pointer1(指向变量num1)和pointer2(指向变量num2),在函数调用开始时才分配存储空间,函数调用结束后立即被释放。虽然被调用函数不能改变实参指针变量的值,但可以改变它们所指向的变量的值。 6.4.2 函数指针 C语言程序设计 (Visual C+ 6.0环境)返回本节目录1.函数指针的概念 一个函数在编译时,被分配了一个入口地址,这个地址就称为该函数的指
36、针。可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数。【例6.11】:求a 和b中的大者。程序名为l6_11.cppmain ( ) int max( ); int (*p)( ); int a,b,c; p=max; scanf (%d,%d”,&a,&b); 6.4.2 函数指针 C语言程序设计 (Visual C+ 6.0环境)返回本节目录c=(*p) (a,b);printf (a= %d,b= %d,max = %d,a,b,c);max (int x,int y)int z;if (xy) z = x;else z=y;return (z)程序说明: 其中int (*p
37、)( )说明p 是一个指向函数的指针变量,此函数带回整型的返回值。注意*p 两侧的括弧不可省略,表示p 先与*结合,是指针变量,然后再与后面的()结合,表示此指针变量指向函数,这个函数值(即函数返回的值)是整型的。如果写成“int *p” ,则由于()优先级高于*,它就成了说明一个函数了,这个函数的返回值是指向整型变量的指针。 6.4.2 函数指针 C语言程序设计 (Visual C+ 6.0环境)返回本节目录 2.指向函数的指针变量(1)定义格式 函数类型 (*指针变量)( ); 注意:“*指针变量”外的括号不能缺,否则成了返回指针值的函数。 例如,int (*fp)(); /* fp为指向
38、int函数的指针变量*/(2)赋值 函数名代表该函数的入口地址。因此,可用函数名给指向函数的指针变量赋值。 指向函数的指针变量&函数名; 注意:函数名后不能带括号和参数;函数名前的“&”符号是可选的。(3)调用格式 (*函数指针变量)(实参表)(4) 函数名作实参时,因为要缺省括号和参数,造成编译器无法判断它是一个变量还是一个函数,所以必须加以说明。(5) 注意:对指向函数的指针变量,诸如p+i、p+/p-等运算是没有意义的。 6.4.2 函数指针 C语言程序设计 (Visual C+ 6.0环境)返回本节目录3.指向函数的指针变量作函数参数 指向函数的指针变量的常用用途之一,就是将函数指针作
39、参数,传递到其它函数。【例6.12】:设一个函数process ,在调用它的时候,每次实现不同的功能。输入a 和b 两个数,第一次调用process时找出a 和b 中大者,第二次找出其中小者,第三次求a 与b 之和。程序如下:程序名为l6_12.cppmain()int max(int,int); /*函数声明*/int min(int,int); /*函数声明*/int add(int,int); /*函数声明*/int a,b;scanf(“%d,%d”,&a,&b);printf(“max=”); 6.4.2 函数指针 C语言程序设计 (Visual C+ 6.0环境)返回本节目录pro
40、cess(a,b,max);printf(“min=”);process(a,b,min);printf(“sum=”);process(a,b,add);max(int x,int y) /*函数定义*/int z;if(xy) z=x;else z=y;return(z);min(int x,int y) /*函数定义*/int z;if(xy) z=x; 6.4.2 函数指针 C语言程序设计 (Visual C+ 6.0环境)返回本节目录else z=y;return(z);add(int x,int y) /*函数定义*/int z;z=x+y;return(z);process(in
41、t x,int y,int(*fun)(int,int) 函数定义. int(*fun)(int,int)表示fun是指向*/*函数的指针,该函数是一个整型函数,有两个整型形参.*/int result;result=(*fun)(x,y);printf(%dn”,result); 6.4.2 函数指针 C语言程序设计 (Visual C+ 6.0环境)返回本节目录程序运行结果如下:3,9max=9min=3sum=12程序说明: max、min 和sum 是已定义的三个函数,分别用来实现求大数、求小数和求和的功能。在main 函数中第一次调用process函数时,除了将a 和b 作为实参将两
42、个数传给process的形参x 、y 外,还将函数名max作为实参将其入口地址传送给process函数中的形参-指向函数的指针变量fun,这时,process函数中的(*fun) ( x , y ) 相当于max ( x , y ) ,执行process可以输出a 和b 中大者。在main函数第二次调用时,改以函数名min 作实参,此时process函数的形参fun 指向函数min , 在process函数中的函数调用(*fun) ( x , y )相当于min ( x , y )。同理,第三次调用process函数时,(*fun) ( x , y )相当于add ( x , y )。从本例可
43、以清楚地看到,不论执行max 、min或add ,函数process 一点都没有改动,只是在调用process函数时实参函数名改变而已。这就增加了函数使用的灵活性。 6.4.3 指针函数 C语言程序设计 (Visual C+ 6.0环境)返回本节目录指针函数是指返回值为指针的函数,函数的返回值可以是不同类型的指针指针函数定义格式如下:函数类型 *函数名(形参表)例如: int *pr(x,y); pr是函数名,调用它以后能得到一个指向整型数据的指针(地址)。x 、y 是函数pr 的形参。请注意在*pr两侧没有括弧,在pr的两侧分别为*运算符和()运算符。而()优先级高于*,因此a 先与()结合
44、。显然这是函数形式。这个函数前面有一个*,表示此函数是指针型函数(函数值是指针)。最前面的int 表示返回的指针指向整型变量。 C语言程序设计 (Visual C+ 6.0环境)返回本章目录6.5.2 指针数组6.5.3 main函数的参数6.5.1 多级指针6.5 多级指针与指针数组6.5.1 多级指针 C语言程序设计 (Visual C+ 6.0环境)1.概念 在前面的叙述中,一个指针变量可以指向一个相应数据类型的数据,例如: int a,*p; p=&a; 使指针p指向a,则指针p所指向的变量*p就是要处理的数据变量a.如果同时存在另一个指针pp,并且把指针p的地址赋予指针变量pp,即:
45、pp=&p; 则pp就指向指针p,这时指针pp所指向的变量*pp就是指针p。在C+中,把pp这样的指向指针的指针称为多级指针。返回本节目录2.定义格式 数据类型 *指针变量, *指针变量2;6.5.1 多级指针 C语言程序设计 (Visual C+ 6.0环境)返回本节目录【例6.13】用二级指针处理多个字符串。程序名为l6_13.cppmain ( ) static char * name = Follow me,BASIC,FORTRAN,Great Wall,Computerdesign; char * * p;int i;for(i=0;i5;i+) p=name+i; printf(
46、“%sn”,*p); 程序运行结果:Follow meBASICFORTRANGreat WallComputerdesign6.5.1 多级指针 C语言程序设计 (Visual C+ 6.0环境)返回本节目录程序说明:指针数组的元素也可以不指向字符串,而指向整型数据或实型数据等,例如:int a5=l,3,5,7,9 ,int *num5=&a0,&al,&a2,&a3,&a4;int * * p ;此时为了得到数据“5 ,可以先使p =num + 2 ,然后输出* p 。注意*p 是p 间接指向的对象的地址。而*p 是p 间接指向的对象的值。6.5.2 指针数组 C语言程序设计 (Visual C+ 6.0环境) 1.概念 2.定义格式 数组的每个元素都是一个指针数据。 数据类型 *数组名元素个数 指针数组常适用于指向若干字符串,这样使字符串处理更加灵活方便。返回本节目录6.5.3 main函数的参数 C语言程序设计 (Visual C+ 6.0环境)返回本节目录指针数组的一个重要应用是作为main函数的形参。在前面讲述的程序中,main函数的第一行全部写成了以下形式:main ( )括号中为空,表示没有参数。实际上main函数是可以带参数的,其一般形式为:main (
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 不战而胜的保险销售技巧课件
- 机器人技术及其应用概述课件
- 公共关系练习题复习试题及答案
- 《SVPWM控制技术》课件
- 《小数运算定律》课件
- 《细胞学相关知识》课件
- 《疫源地消毒技术》课件
- 重难点专题 1-1 函数的对称性与周期性问题【18类题型】(解析版)-2025届高考数学热点题型归纳与重难点突(新高考专用)
- 《通过激素调节》课件
- 《高速脉冲输出指令》课件
- XX电站接地装置的热稳定校验报告(220kV)
- JC-T 2704-2022 聚酯纤维装饰吸声板
- 火炬计划项目申报指南
- 毒麻药品管理相关知识护理课件
- WTE朗文英语2B 单词卡片
- SB-T 11238-2023 报废电动汽车回收拆解技术要求
- 供热管道施工方案
- 《穴位注射疗法》课件
- 初三物理复习计划详细计划
- 管理会计 课件 孙茂竹 第7-12章 存货决策-业绩考核
- 空气能热泵系统设计与安装展示
评论
0/150
提交评论