收藏 分销(赏)

第6-指针和引用.pptx

上传人:精*** 文档编号:4232040 上传时间:2024-08-27 格式:PPTX 页数:56 大小:1.06MB
下载 相关 举报
第6-指针和引用.pptx_第1页
第1页 / 共56页
第6-指针和引用.pptx_第2页
第2页 / 共56页
第6-指针和引用.pptx_第3页
第3页 / 共56页
第6-指针和引用.pptx_第4页
第4页 / 共56页
第6-指针和引用.pptx_第5页
第5页 / 共56页
点击查看更多>>
资源描述

1、第第第第6 6章章章章 指针与引用指针与引用指针与引用指针与引用 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本章导读返回本章导读 6.2 指针指针 6.3 指针与数组指针与数组 6.5 多级指针与指针数组多级指针与指针数组 6.4 指针与函数指针与函数 6.1 关于指针的关于指针的C程序实例程序实例6.6 6.6 引用引用6.7 6.7 内存管理内存管理 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设

2、设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本章目录返回本章目录6.1.1 C程序实例程序实例6.1 6.1 关于指针关于指针关于指针关于指针的的的的C C程序实例程序实例程序实例程序实例 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录2.C程序实例程序实例(2)1.C程序实例程序实例(1)6.1.1 C6.1.1 C程序实例程序实例

3、程序实例程序实例6.1.1 C6.1.1 C程序实例(程序实例(程序实例(程序实例(1 1)C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录1.C程序实例1【例6.1】指针变量的定义示例。/*程序名为l5_1.cpp*/*程序功能:验证指针变量的定义*/main()int num_int=12,*p_int;/*定义一个指向int型数据的指针变量p_int*/float num_f=3.14,*p_f;/*定义一个指向

4、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;/*取变量num_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_

5、ch,*p_ch);程序运行结果:num_int=12,*p_int=12num_f=3.14,*p_f=3.14num_ch=p,*p_ch=p程序演示程序演示 例例例例6.16.1 程序演示程序演示程序演示程序演示单击运行输入源程序弹出运行结果窗口返回例题返回例题返回本节目录返回本节目录6.1.1 C6.1.1 C程序实例(程序实例(程序实例(程序实例(2 2)C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)2.C程序实例2【例6.2】输

6、入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,num2);if(*num1_p *num2_p)/*如果num1num2,则交换

7、指针*/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.26.2 程序演示程序演示程序演示程序演示单击运行输入源程序弹出运行结果窗口返回例题返回例题返回本节目录返回本节目录 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计

8、计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本章目录返回本章目录6.2.2 指向变量的指针变量指向变量的指针变量6.2.1 地址和指针的概念地址和指针的概念6.2 6.2 指针指针指针指针 6.2.1 6.2.1 地址和指针的概念地址和指针的概念地址和指针的概念地址和指针的概念 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)1.内存地址内存中存储单元的编号2.变量地址系

9、统分配给变量的内存单元的起始地址(1)计算机硬件系统的内存储器中,拥有大量的存储单元(每个存储单元容量为字节)。为了方便管理,必须为每一个存储单元编号,这个编号就是存储单元的“地址”。每个存储单元都有一个惟一的地址。(2)在地址所标识的存储单元中存放数据。注意:内存单元的地址与内存单元中的数据是两个完全不同的概念。假设有这样一个程序:main()int num;scanf(%d,&num);printf(num=%dn,num);C编译程序编译到该变量定义语句时,将变量num 登录到“符号表”中。符号表的关键属性有两个:一是“标识符名(id)”,二是该标识符在内存空间中的“地址(addr)”。

10、为描述方便,假设系统分配给变量num的2字节存储单元为 3000 和3001,则起始地址3000就是变量num在内存中的地址。返回本节目录返回本节目录6.2.1 6.2.1 地址和指针的概念地址和指针的概念地址和指针的概念地址和指针的概念 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)3.变量值的存取通过变量在内存中的地址进行系统执行“scanf(”%d“,&num);”和“printf(”num=%dn“,num);”时,存取变量num值

11、的方式可以有两种:(1)直接访问直接利用变量的地址进行存取 上例中scanf(“%d”,&num)的执行过程是这样的:用变量名num作为索引值,检索符号表,找到变量num的起始地址3000;然后将键盘输入的值(假设为)送到内存单元3000和3001中。printf(num=%dn,num)的执行过程,与scanf()很相似:首先找到变量num的起始地址3000,然后从3000和3001中取出其值,最后将它输出。返回本节目录返回本节目录6.2.1 6.2.1 地址和指针的概念地址和指针的概念地址和指针的概念地址和指针的概念 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设

12、设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)(2)间接访问通过另一变量访问该变量的值 语言规定:在程序中可以定义一种特殊的变量(称为指针变量),用来存放其它变量的地址。例如,假设定义了这样一个指针变量num_pointer,它被分配到4000、4001单元,其值可通过赋值语句“num_pointer=num;”得到。此时,指针变量num_pointer的值就是变量num在内存中的起始地址3000。【例5.2】中 printf(“min=%d,max=%dn”,*num1_p,*num2_p);语句:通过指针变

13、量,间接访问变量的值。返回本节目录返回本节目录6.2.2 6.2.2 指向变量的指针变量指向变量的指针变量指向变量的指针变量指向变量的指针变量 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录1.指针与指针变量(1)指针即地址 一个变量的地址称为该变量的指针。通过变量的指针能够找到该变量。(2)指针变量专门用于存储其它变量地址的变量指针变量num_pointer的值就是变量num的地址。指针与指针变量的区别,就是变量值

14、与变量的区别。(3)为表示指针变量和它指向的变量之间的关系,用指针运算符“*”表示。例如,指针变量num_pointer与它所指向的变量num的关系,表示为:*num_pointer,即*num_pointer等价于变量num。因此,下面两个语句的作用相同:num=3;/*将3直接赋给变量num*/num_pointer=#/*使num_pointer指向num*/*num_pointer=3;/*将3赋给指针变量num_pointer所指向的变量*/6.2.2 6.2.2 指向变量的指针变量指向变量的指针变量指向变量的指针变量指向变量的指针变量 C C C C C C语语语语语语言言

15、言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回本节本节目录目录2.指针变量的定义与应用【例6.1】程序中头三行的变量定义语句指针变量的定义 与一般变量的定义相比,除变量名前多了一个星号“*”(指针变量的定义标识符)外,其余一样:数据类型 *指针变量,*指针变量2;注意:此时的指针变量p_int、p_f、p_ch,并未指向某个具体的变量(称指针是悬空的)。使用悬空指针很容易破坏系统,导致系统瘫痪。【例6.1】中间三行的赋值语句取地址运算()取地址运算的格式:变量例如,&n

16、um_int、&num_f、&num_ch的结果,分别为变量num_int、num_f、num_ch的地址。注意:指针变量只能存放指针(地址),且只能是相同类型变量的地址。C语言中用NULL表示空指针。若有语句:p=NULL;则表示指针p为空,没有指向任何对象。C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本章目录返回本章目录 6.3.2 通过指针引用数组元素通过指针引用数组元素6.3.1 指向数组元素的指针指向数组元素的指针6.3 6

17、.3 指针与数组指针与数组指针与数组指针与数组6.3.3 数组名作函数参数数组名作函数参数6.3.4 指针与字符数组指针与字符数组6.3.5 数组指针数组指针6.3.1 6.3.1 6.3.1 6.3.1 指向数组元素的指针指向数组元素的指针指向数组元素的指针指向数组元素的指针 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录指向数组的元素指针变量的定义,与指向普通变量的指针变量的定义方法一样例如,int array1

18、0;(定义array为包含10个整型变量的数组)int *pointer (定义pointer为指向整型变量的指针变量)应当注意应当注意,如果数组为int 型,则指针变量亦应指向int 型。下面是对该指针赋值:pointer=&array0;把array0 元素的地址赋给指针变量pointer。也就是说,pointer 指向 array数组的第0号元素。C 语言规定数组名代表数组的首地址,也就是第一个元素的地址。因此,下面两个语句等价pointer=&array0;pointerarray;注意:注意:数组名不代表整个数组,上述“pointerarray;”的作用是“把array数组的第一个元

19、素的地址赋给指针变量pointer”而不是“把array数组各元素的值赋给pointer”。6 6.3.2 .3.2 通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录1 通过指针引用一维数组中的元素 如果有“int array10,*pointer=array;”,则:(1)pointer+i和array+i都是数组元素arrayi的地址

20、。(2)*(pointer+i)和*(array+i)就是数组元素arrayi。(3)指向数组的指针变量,也可将其看作是数组名,因而可按下标法来使用。例如,pointeri等价于*(pointer+i)。注意注意:pointer+1指向数组的下一个元素,而不是简单地使指针变量pointer的值+1。其实际变化为pointer+1*size(size为一个元素占用的字节数)。例如,假设指针变量pointer的当前值为3000,则pointer+1为3000+1*2=3002,而不是3001。6 6.3.2 .3.2 通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素

21、 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录【例6.3】使用指向数组的指针变量来引用数组元素。/*程序名为l6_3.cpp*/*程序功能:使用指向数组的指针变量来引用数组元素*/main()int array10,*pointer=array,i;printf(“Input 10 numbers:”);for(i=0;i10;i+)scanf(“%d”,pointer+i);/*使用指针变量来输入数组元素的值*/

22、printf(“array10:”);for(i=0;i10;i+)printf(“%d ”,*(pointer+i);/*使用指向数组的指针变量输出数组*/printf(“n”);6 6.3.2 .3.2 通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录程序运行情况:Input 10 numbers:0 1 2 3 4 5 6 7 8

23、9array10:0 1 2 3 4 5 6 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 6.3.2 .3.2 通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素 C C C C C C语语语语语语言言言言言言程程程程程程序序序

24、序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录2 通过指针引用二维数组中的元素 在C语言中,二维数组是按行优先的规律转换为一维线性存放在内存中的,因此,可以通过指针访问二维数组中的元素。如果有:int aMN;则将二维数组中的元素aij转换为一维线性地址的一般公式是:线性地址aiMj 其中:a为数组的首地址,M和N分别为二维数组行和列的元素个数。6 6.3.2 .3.2 通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素 C C C C C C语语语

25、语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录【例6.46.4】:给定某年某月某日,将其转换成这一年的第几天并输出。此题的算法很简单,若给定的月是i,则将1、2、3、i1月的各月天数累加,再加上指定的日。但对于闰年,二月的天数29天,因此还要判定给定的年是否为闰年。为实现这一算法,需设置一张每月天数列表,给出每个月的天数,考虑闰年非闰年的情况,此表可设置成一个2行13列的二维数组,其中第1行对应的每列(设112列有效)元素是平年各月的天数,第2

26、行对应的是闰年每月的天数。程序中使用指针作为函数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 6.3.2 .3.2 通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素通过指针引用数组元素 C C C C C C语语语语语语

27、言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录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+

28、i*13+j);/*day_tab+i*13+j:对二维数组中元素进行地址变换*/return(day);由于语言对于二维数组中的元素在内存中是按行存放的,所以在函数day_of_year 中要使用公式day_tab+i*13+j计算main函数的day_tab中元素对应的地址。6 6.3.3.3 3 数组名作函数参数数组名作函数参数数组名作函数参数数组名作函数参数 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录数组

29、名可以用作函数的形参和实参。数组名可以用作函数的形参和实参。如:main()int array10;f(array,10)f(arr,n)int arr,n;array 为实参数组名,arr 为形参数组名。6 6.3.3.3 3 数组名作函数参数数组名作函数参数数组名作函数参数数组名作函数参数 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录【例6.5】将数组a 中n 个整数按相反顺序存放 解此题的算法为:将a 0与a

30、n1 对换,再将a1与an2对换,直到将a(n1)/2 与a nint(n1)/2)对换。今用循环处理此问题,设两个“位置指示变量”i 和j,i 的初值为0,j 的初值为n1。将ai与aj 交换,然后使i 的值加1,j 的值减1,再将ai与aj对换,直到i=(n1)/2 为止。程序如下:程序名为l6_5.cppVoid inv(int x,int n)/*形参x是数组名*/int temp,i,j,m=(n1)/2;for(i=0;i=m;i+)j=n1i;temp=xi;xiI=xj;xj=temp;return;main()int i,a10=3,7,9,11,0,6,7,5,4,2;fo

31、r(i=0;i10;i+)6 6.3.3.3 3 数组名作函数参数数组名作函数参数数组名作函数参数数组名作函数参数 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录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

32、,8,3,程序说明:程序说明:主函数中数组名为 a,赋以各元素初值。函数 inv 中的形参数组名为 x,在 inv 函数中不具体定义数组元素的个数,元素个数由形参变量 n 传入(今对应的实参值为 10)。这样做可以增加函数的灵活性。即不必要求函数 inv 中的形参数组 x 和 main 函数中的实参数组 a 长度相同。如果在main函数中有函数调用语句:“inv(a,10)”,表示要求对 a 数组的前 10 个元素实行题目要求的颠倒排列。如果改为“inv(a,5)”,则表示将 a 数组的前 5 个元素实行颠倒排列,此时,函数 inv 只处理 5 个数组元素。函数 inv 中的 m 是 i 值的

33、上限,当 i m 时,则结束循环过程。6 6.3.3.3 3 数组名作函数参数数组名作函数参数数组名作函数参数数组名作函数参数 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录 小结小结:引入指向数组的指针变量后,数组及指向数组的指针变量作函数参数时,可有种等价形式(本质上是一种,即指针数据作函数参数):(1)形参、实参都用数组名(2)形参、实参都用指针变量(3)形参用指针变量、实参用数组名(4)形参用数组名、实参用指

34、针变量 6 6.3.4 .3.4 指针与字符数组指针与字符数组指针与字符数组指针与字符数组 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录1.字符串的表示与引用在语言中,既可以用字符数组表示字符串,也可用字符指针变量来表示;引用时,既可以逐个字符引用,也可以整体引用。(1)逐个引用逐个引用【例6.6】使用字符指针变量表示和引用字符串。/*程序名为l6_6.cpp/main()char*string=”I love B

35、eijing.”;for(;*string!=0;string+)printf(“%c”,*string);printf(“n”);程序运行结果:I love Beijing.程序说明:程序说明:char*string=I love Beijing.;语句定义并初始化字符指针变量string:用串常量“I love Beijing.”的地址(由系统自动开辟、存储串常量的内存块的首地址)给string赋初值。6 6.3.4 .3.4 指针与字符数组指针与字符数组指针与字符数组指针与字符数组 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VV

36、i iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录(2)整体引用整体引用【例6.7】采取整体引用的办法,改写例5.9。/*程序名为l6_7.cpp*/*程序功能:使用字符指针变量表示和引用字符串*/main()char*string=”I love Beijing.”;printf(“%sn”,string);程序说明程序说明:printf(“%sn”,string);语句 通过指向字符串的指针变量string,整体引用它所指向的字符串的原理:系统首先输出string指向的第一个字符,然后使string自动加,使之指向下一个

37、字符;重复上述过程,直至遇到字符串结束标志。注意:注意:其它类型的数组,是不能用数组名来一次性输出它的全部元素的,只能逐个元素输出。6 6.3.4 .3.4 指针与字符数组指针与字符数组指针与字符数组指针与字符数组 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录2.字符指针变量与字符数组之比较虽然用字符指针变量和字符数组都能实现字符串的存储和处理,但二者是有区别的,不能混为一谈。(1)存储内容不同。字符指针变量中存储

38、的是字符串的首地址,而字符数组中存储的是字符串本身(数组的每个元素存放一个字符)。(2)赋值方式不同。对字符指针变量,可采用下面的赋值语句赋值:char *pointer;pointer=This is a example.;而字符数组,虽然可以在定义时初始化,但不能用赋值语句整体赋值。下面的用法是非法的:char char_array20;char_array=This is a example.;/*非法用法*/(3)指针变量的值是可以改变的,字符指针变量也不例外;6 6.3.4 .3.4 指针与字符数组指针与字符数组指针与字符数组指针与字符数组 C C C C C C语语语语语语言言言言

39、言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录3.字符串指针作函数参数【例6.8】用函数调用方式,实现字符串的复制。/*程序名为l6_8.cpp*/*/*string_copy()函数:复制一个字符串*/*形参:字符指针str_from接收源串,字符指针 str_to存储目标串*/*返回值:无*/*/void string_copy(char*str_from,char*str_to)int i=0;for(;(*(str_to+i)=*(str_from+

40、i)!=0;i+);/*循环体为空语句*/main()char array_str120=”I am a teacher.”;char array_str220;6 6.3.4 .3.4 指针与字符数组指针与字符数组指针与字符数组指针与字符数组 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录string_copy(array_str1,array_str2);/*数组名作实参*/printf(“array_str2=

41、%sn”,array_str2);程序运行结果:I am a teacher.程序说明:程序说明:for(;(*(str_to+i)=*(str_from+i)!=0;i+);语句的执行过程为:首先将源串中的当前字符,复制到目标串中;然后判断该字符(即赋值表达式的值)是否是结束标志。如果不是,则相对位置变量i的值增1,以便复制下一个字符;如果是结束标志,则结束循环。其特点是:先复制、后判断,循环结束前,结束标志已经复制。6 6.3.5 .3.5 数组指针数组指针数组指针数组指针 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis

42、 ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节目录返回本节目录 我们上面介绍的指针都是指向某一类型的变量的,例如可以使一个指针p指向某一数组元素。如果p的值加1,则指向下一个元素,这样指针在处理一维数组时非常方便,但在处理二维数组时就不适合了。如果定义一个指针p,让它指向一个包含n个元素的一维数组,且p的增值以一维数组的长度为单位,此时,如果指针P指向二维数组的某一行,则p+1就指向了该二维数组的下一行。在C+中,这样的指针被称为数组指针,使用数组指针可以很方便地处理二维数组。数组指针的说明形式如下:存储类型存储类型 数据类型数据类型 (*指针名

43、指针名)元素个数元素个数 例如,在程序中定义一个数组指针:int(*p)4;它表明指针p指向的数组指针p指向一个一维数组,p的值就是该一维数组的首地址。在使用数组指针时,有两点一定要注意:(1)*p两侧的括号一定不要漏掉,如果写成*p4的形式,由于 的运算级别高,因此p先和4结合,是数组,然后再与前面的*结合,*p4是指针数组。6 6.3.5 .3.5 数组指针数组指针数组指针数组指针 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回本节

44、目录返回本节目录(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);/*输出排序后的num1和num2的值*/程序运行情况:Input the first number:9Inp

45、ut the second number:6num1=9,num2=6min=6,max=9程序说明:程序说明:形参指针变量pointer1(指向变量num1)和pointer2(指向变量num2),在函数调用开始时才分配存储空间,函数调用结束后立即被释放。虽然被调用函数不能改变实参指针变量的值,但可以改变它们所指向的变量的值。6.4.2 6.4.2 函数指针函数指针函数指针函数指针 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回本

46、节本节目录目录1.函数指针的概念 一个函数在编译时,被分配了一个入口地址,这个地址就称为该函数的指针函数的指针。可以用一个指针变量指向一个函数,然后通过该指针变量调用此函数。【例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 6.4.2 函数指针函数指针函数指针函数指针 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环

47、环环环境境境境境境)返回返回本节本节目录目录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)()说明p 是一个指向函数的指针变量,此函数带回整型的返回值。注意*p 两侧的括弧不可省略,表示p 先与*结合,是指针变量,然后再与后面的()结合,表示此指针变量指向函数,这个函数值(即函数返回的值)是整型的。如果写成“int*p”,则由于()优先级高于*,它就成了说明一个函数了,这个函数的返回值是指向整型变量的指针。6.4.2

48、6.4.2 函数指针函数指针函数指针函数指针 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回本节本节目录目录 2.指向函数的指针变量(1)定义格式 函数类型函数类型 (*指针变量指针变量)();注意:“*指针变量”外的括号不能缺,否则成了返回指针值的函数。例如,int(*fp)();/*fp为指向int函数的指针变量*/(2)赋值 函数名代表该函数的入口地址。因此,可用函数名给指向函数的指针变量赋值。指向函数的指针变量&函数名;注意

49、:注意:函数名后不能带括号和参数;函数名前的“&”符号是可选的。(3)调用格式 (*函数指针变量)(实参表)(4)函数名作实参时,因为要缺省括号和参数,造成编译器无法判断它是一个变量还是一个函数,所以必须加以说明。(5)注意:对指向函数的指针变量,诸如p+i、p+/p等运算是没有意义的。6.4.2 6.4.2 函数指针函数指针函数指针函数指针 C C C C C C语语语语语语言言言言言言程程程程程程序序序序序序设设设设设设计计计计计计 (V VVi iis ssu uua aal ll C CC+6 66.0 00环环环环环环境境境境境境)返回返回本节本节目录目录3.指向函数的指针变量作函数

50、参数 指向函数的指针变量的常用用途之一,就是将函数指针作参数,传递到其它函数。【例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 6.4.2 函数指针函数指针函数

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
百度文库年卡

猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服