第8章善于利用指针.ppt

上传人:本田雅阁 文档编号:3133318 上传时间:2019-07-15 格式:PPT 页数:213 大小:3.95MB
返回 下载 相关 举报
第8章善于利用指针.ppt_第1页
第1页 / 共213页
第8章善于利用指针.ppt_第2页
第2页 / 共213页
第8章善于利用指针.ppt_第3页
第3页 / 共213页
第8章善于利用指针.ppt_第4页
第4页 / 共213页
第8章善于利用指针.ppt_第5页
第5页 / 共213页
点击查看更多>>
资源描述

《第8章善于利用指针.ppt》由会员分享,可在线阅读,更多相关《第8章善于利用指针.ppt(213页珍藏版)》请在三一文库上搜索。

1、第8章 善于利用指针,8.1 指针是什么 8.2 指针变量 8.3 通过指针引用数组 8.4 通过指针引用字符串 8.5 指向函数的指针 8.6 返回指针值的函数 8.7 指针数组和多重指针 8.8 动态内存分配与指向它的指针变量 8.9 有关指针的小结,8.1 指針是什么,如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元 编译系统根据程序中定义的变量类型,分配一定长度的空间 例如,VC+为整型变量分配4个字节,对单精度浮点型变量分配个字节,对字符型变量分配个字节,8.1 指针是什么,内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。 在地址所标

2、识的内存单元中存放数据,这相当于旅馆房间中居住的旅客一样。 由于通过地址能找到所需的变量单元,我们可以说,地址指向该变量单元。 将地址形象化地称为“指针”,务必弄清楚存储单元的地址和存储单元的内容这两个概念的区别 例如:,int i=3,j=6,k;,printf(“%d”,i);,通过变量名i,找到i的地址2000,从而从存储单元读取3,int i=3,j=6,k;,k=i+j;,从这里取3,将9送到这里,从这里取6,直接存取,int i=3,j=6,k;,定义特殊变量i_pointer,将i的地址存到这里,间接存取,i_pointer=,*i_pointer=50;,50,i,2000,3

3、,2000,i_pointer,*i_pointer,2000,3,直接存取,间接存取,为了表示将数值送到变量中,可以有两种表达方法: (1) 将3直接送到变量i所标识的单元中,例如:i=3; (2) 将3送到变量i_pointer所指向的单元(即变量i的存储单元),例如:*i_pointer=3; 其中*i_pointer表示i_pointer指向的对象,指向就是通过地址来体现的 假设i_pointer中的值是变量的地址(2000),这样就在i_pointer和变量之间建立起一种联系,即通过i_pointer能知道i的地址,从而找到变量i的内存单元,由于通过地址能找到所需的变量单元,因此说,

4、地址指向该变量单元 将地址形象化地称为“指针”。意思是通过它能找到以它为地址的内存单元,一个变量的地址称为该变量的“指针” 例如,地址2000是变量的指针 如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量” i_pointer就是一个指针变量。指针变量就是地址变量,用来存放地址的变量,指針变量的值是地址(即指针),“指针”和“指针变量”是不同的概念 可以说变量i的指针是2000,而不能说i的指针变量是2000 指针是一个地址,而指针变量是存放地址的变量,8.2 指针变量,8.2.1使用指针变量的例子 8.2.2 怎样定义指针变量 8.2.3 怎样引用指针变量 8.2.4

5、指针变量作为函数参数,8.2.1使用指针变量的例子,例8.1 通过指针变量访问整型变量。 解题思路:先定义2个整型变量,再定义2个指针变量,分别指向这两个整型变量,通过访问指针变量,可以找到它们所指向的变量,从而得到这些变量的值。,#include int main() int a=100,b=10; int *pointer_1, *pointer_2; pointer_1= ,定义两个指针变量,使pointer_1指向a,使pointer_2指向b,直接输出变量a和b的值,间接输出变量a和b的值,#include int main() int a=100,b=10; int *pointe

6、r_1, *pointer_2; pointer_1= ,此处*与类型名在一起。此时共同定义指针变量,此处*与指针变量一起使用。此时代表指针变量所指向的变量,8.2.2 怎样定义指针变量,定义指针变量的一般形式为: 类型 * 指针变量名; 如:int *pointer_1, *pointer_2; int是为指针变量指定的“基类型” 基类型指定指针变量可指向的变量类型 如pointer_1可以指向整型变量,但不能指向浮点型变量,8.2.2 怎样定义指针变量,下面都是合法的定义和初始化: float *pointer_3; char *pointer_4; int a,b; int *point

7、er_1=,*pointer_1 错误,pointer_3 错误,pointer_1 正确,pointer_32000; 错误,8.2.3 怎样引用指针变量,在引用指针变量时,可能有三种情况: 给指针变量赋值。如:p=,使p指向a,*p相当于a,以八进制输出a的地址,8.2.3 怎样引用指针变量,要熟练掌握两个有关的运算符: (1) 取地址运算符。 (把1赋给a),例8.2 输入a和b两个整数,按先大后小的顺序输出a和b。 解题思路:用指针方法来处理这个问题。不交换整型变量的值,而是交换两个指针变量的值。,#include int main() int *p1,*p2,*p,a,b; prin

8、tf(“integer numbers:“); scanf(“%d,%d”, ,a,b,p1,p2,p,5,9,&a,&b,成立,#include int main() int *p1,*p2,*p,a,b; printf(“integer numbers:“); scanf(“%d,%d”, ,a,b,p1,p2,p,5,9,&a,&b,&b,&a,#include int main() int *p1,*p2,*p,a,b; printf(“integer numbers:“); scanf(“%d,%d”, ,a,b,p1,p2,p,5,9,&a,&b,&b,&a,#include in

9、t main() int *p1,*p2,*p,a,b; printf(“integer numbers:“); scanf(“%d,%d”, ,a,b,p1,p2,p,5,9,&a,&b,&b,&a,可否改为p1=?,注意: a和b的值并未交换,它们仍保持原值 但p1和p2的值改变了。p1的值原为&a,后来变成&b,p2原值为&b,后来变成&a 这样在输出*p1和*p2时,实际上是输出变量b和a的值,所以先输出9,然后输出5,8.2.4 指针变量作为函数参数,例8.3 题目要求同例8.2,即对输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。 解题思路:定义一个函数

10、swap,将指向两个整型变量的指针变量作为实参传递给swap函数的形参指针变量,在函数中通过指针实现交换两个变量的值。,#include int main() void swap(int *p1,int *p2); int a,b; int*pointer_1,*pointer_2; printf(“please enter a and b:“); scanf(“%d,%d”, ,a,b,pointer_1,5,9,&a,&b,pointer_2,void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; ,a,b,poi

11、nter_1,5,9,&a,&b,pointer_2,p1,&a,p2,&b,9,5,void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; ,void swap(int *p1,int *p2) int *temp; *temp=*p1; *p1=*p2; *p2=*temp; ,错! 无确定的指向,#include int main() if (ab) swap(a,b); printf(“max=%d,min=%dn”,a,b); return 0; void swap(int x,int y) int temp

12、; temp=x; x=y; y=temp; ,错! 无法交换a,b,a,b,5,9,x,y,5,9,9,5,如果想通过函数调用得到个要改变的值: 在主调函数中设个变量,用个指针变量指向它们 设计一个函数,有n个指针形参。在这个函数中改变这个形参的值 在主调函数中调用这个函数,在调用时将这n个指针变量作实参,将它们的地址传给该函数的形参 在执行该函数的过程中,通过形参指针变量,改变它们所指向的个变量的值 主调函数中就可以使用这些改变了值的变量,例8.4 对输入的两个整数按大小顺序输出。 解题思路:尝试调用swap函数来实现题目要求。在函数中改变形参(指针变量)的值,希望能由此改变实参(指针变量

13、)的值,#include int main() void swap(int *p1,int *p2); int a,b; int*pointer_1,*pointer_2; scanf(“%d,%d“, ,void swap(int *p1,int *p2) int *p; p=p1; p1=p2; p2=p; ,错! 只交换形参指向,注意:函数的调用可以(而且只可以)得到一个返回值(即函数值),而使用指针变量作参数,可以得到多个变化了的值。如果不用指针变量是难以做到这一点的。 要善于利用指针法。,例8.5 输入3个整数a,b,c,要求按由大到小的顺序将它们输出。用函数实现。 解题思路:采用例

14、8.3的方法在函数中改变这3个变量的值。用swap函数交换两个变量的值,用exchange函数改变这3个变量的值。,#include int main() void exchange(int *q1, int *q2, int *q3); int a,b,c,*p1,*p2,*p3; scanf(“%d,%d,%d“, ,调用结束后不会改变指针的指向,void exchange(int *q1, int *q2, int *q3) void swap(int *pt1, int *pt2); if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(

15、*q2*q3) swap(q2,q3); void swap(int *pt1, int *pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; ,交换指针指向的变量值,8.3通过指针引用数组,8.3.1 数组元素的指针 8.3.2 在引用数组元素时指针的运算 8.3.3 通过指针引用数组元素 8.3.4 用数组名作函数参数 8.3.5 通过指针引用多维数组,8.3.1 数组元素的指针,一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址 指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中) 所谓数组元素的指针就是数组元素的地址,

16、可以用一个指针变量指向一个数组元素 int a10=1,3,5,7,9,11,13,15,17,19; int *p; p=,等价于p=a;,等价于int *p=a; 或int *p=,注意:数组名a不代表整个数组,只代表数组首元素的地址。“p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”,而不是“把数组a各元素的值赋给p”。,8.3.2 在引用数组元素时指针的运算,在指针指向数组元素时,允许以下运算: 加一个整数(用+或+=),如p+1 减一个整数(用-或-=),如p-1 自加运算,如p+,+p 自减运算,如p-,-p 两个指针相减,如p1-p2 (只有p1和p2都指向同一数组中的

17、元素时才有意义),(1) 如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。 float a10,*p=a; 假设a0的地址为2000,则 p的值为2000 p+1的值为2004 P-1的值为1996,越界,(2) 如果的初值为&a0,则p+i和a+i就是数组元素ai的地址,或者说,它们指向a数组序号为i的元素,p,p+1,a+1,p+i,a+i,p+9,a+9,(3) *(p+i)或*(a+i)是p+i或a+i所指向的数组元素,即ai。,p,p+1,a+1,p+i,a+i,p+9,a+9,*(p+i),(4) 如果指针p1和p2都指向

18、同一数组 p2-p1的值是4 不能p1+p2,p1,p2,8.3.3 通过指针引用数组元素,引用一个数组元素,可用下面两种方法: () 下标法,如ai形式 () 指针法,如*(a+i)或*(p+i) 其中a是数组名,p是指向数组元素的指针变量,其初值p=a,8.3.3 通过指针引用数组元素,例8.6 有一个整型数组a,有10个元素,要求输出数组中的全部元素。 解题思路:引用数组中各元素的值有3种方法:(1)下标法;(2)通过数组名计算数组元素地址,找出元素的值;(3) 用指针变量指向数组元素 分别写出程序,以资比较分析。,(1) 下标法。 #include int main() int a10

19、; int i; printf(“enter 10 integer numbers:n“); for(i=0;i10;i+) scanf(“%d“, ,(2) 通过数组名计算数组元素地址,找出元素的值 #include int main() int a10; int i; printf(“enter 10 integer numbers:n“); for(i=0;i10;i+) scanf(“%d“, ,scanf(“%d“,a+i);,(3) 用指针变量指向数组元素 #include int main() int a10; int *p,i; printf(“enter 10 integer

20、 numbers:n“); for(i=0;i10;i+) scanf(“%d“, ,for(p=a;p(a+10);p+) scanf(“%d“,p);,for(p=a;p(a+10);a+) printf(“%d ”,*a); 错!,3种方法的比较: 第(1)和第(2)种方法执行效率相同 编译系统是将ai转换为*(a+i)处理的,即先计算元素地址。 因此用第(1)和第(2)种方法找数组元素费时较多。,3种方法的比较: 第(3)种方法比第(1)、第(2)种方法快 用指针变量直接指向元素,不必每次都重新计算地址,像p+这样的自加操作是比较快的 这种有规律地改变地址值(p+)能大大提高执行效率,

21、3种方法的比较: 用下标法比较直观,能直接知道是第几个元素。 用地址法或指针变量的方法不直观,难以很快地判断出当前处理的是哪一个元素。,例8.7 通过指针变量输出整型数组a的10个元素。 解题思路: 用指针变量p指向数组元素,通过改变指针变量的值,使p先后指向a0到a9各元素。,#include int main() int *p,i,a10; p=a; printf(“enter 10 integer numbers:n“); for(i=0;i10;i+) scanf(“%d”,p+); for(i=0;i10;i+,p+) printf(“%d ”,*p); printf(“n“); r

22、eturn 0; ,退出循环时p指向a9后面的存储单元,因此执行此循环出问题,重新执行 p=a;,8.3.4 用数组名作函数参数,用数组名作函数参数时,因为实参数组名代表该数组首元素的地址,形参应该是一个指针变量 C编译都是将形参数组名作为指针变量来处理的,int main() void fun(int arr,int n; int array10; fun (array,10); return 0; void fun(int arr ,int n) ,fun(int *arr,int n),int main() void fun(int arr,int n; int array10; fun

23、 (array,10); return 0; void fun(int *arr,int n) ,array0,arr0,array数组,arr,array3,arr3,arr+3,实参数组名是指针常量,但形参数组名是按指针变量处理 在函数调用进行虚实结合后,它的值就是实参数组首元素的地址 在函数执行期间,形参数组可以再被赋值 void fun (arr ,int n) printf(%dn, *arr); arr=arr+3; printf(%dn, *arr); ,例8.8 将数组a中n个整数按相反顺序存放 解题思路:将a0与an-1对换,将a4与a5对换。,j,i,例8.8 将数组a中n

24、个整数按相反顺序存放 解题思路:将a0与an-1对换,将a4与a5对换。,j,i,例8.8 将数组a中n个整数按相反顺序存放 解题思路:将a0与an-1对换,将a4与a5对换。,j,i,例8.8 将数组a中n个整数按相反顺序存放 解题思路:将a0与an-1对换,将a4与a5对换。,j,i,例8.8 将数组a中n个整数按相反顺序存放 解题思路:将a0与an-1对换,将a4与a5对换。,j,i,#include int main() void inv(int x ,int n); int i, a10=3,7,9,11,0,6,7,5,4,2; for(i=0;i10;i+) printf(“%d

25、 ”,ai); printf(“n“); inv(a,10); for(i=0;i10;i+) printf(“%d ”,ai); printf(“n“); return 0; ,void inv(int x ,int n) int temp,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; temp=xi;xi=xj;xj=temp; ,void inv(int x ,int n) int temp,*i,*j; i=x; j=x+n-1; for( ; ij; i+,j-) temp=*i; *i=*j; *j=temp; ,优化,例8.9 改写例8.8,用指

26、针变量作实参。,#include int main() void inv(int *x,int n); int i, arr10,*p=arr; for(i=0;i10;i+,p+) scanf(“%d”,p); inv(p,10); for(p=arr;parr+10;p+) printf(“%d ”,*p); printf(“n“); return 0; ,不可少!,例8.10 用指针方法对10个整数按由大到小顺序排序。 解题思路: 在主函数中定义数组a存放10个整数,定义int *型指针变量p指向a0 定义函数sort使数组a中的元素按由大到小的顺序排列 在主函数中调用sort函数,用指

27、针p作实参 用选择法进行排序,#include int main() void sort(int x ,int n); int i,*p,a10; p=a; for(i=0;i10;i+) scanf(“%d”,p+); p=a; sort(p,10); for(p=a,i=0;i10;i+) printf(“%d ”,*p); p+; printf(“n“); return 0; ,void sort(int x,int n) int i,j,k,t; for(i=0;ixk) k=j; if(k!=i) t=xi;xi=xk;xk=t; ,void sort(int *x,int n),i

28、f (*(x+j)*(x+k) k=j;,t=*(x+i);*(x+i)=*(x+k);*(x+k)=t;,8.3.5 通过指针引用多维数组,指针变量可以指向一维数组中的元素,也可以指向多维数组中的元素。但在概念上和使用方法上,多维数组的指针比一维数组的指针要复杂一些。,8.3.5 通过指针引用多维数组,1. 多维数组元素的地址 int a34=1,3,5,7, 9,11,13,15,17,19,21,23;,a,a+1,a+2,a0,a0+1,a0+2,a0+3,行指针,列指针,a代表第0行首地址 a+1代表第1行首地址 a+2代表第2行首地址,a,a+1,a+2,a0,a0+1,a0+2,

29、a0+3,行指针,列指针,行指针每加1,走一行,a+i代表行号为i的行首地址(按行变化) *(a+i)代表什么?,a,a+1,a+2,a0,a0+1,a0+2,a0+3,行指针,列指针,相当于ai,a0代表a00的地址 a0+1代表a01的地址 a0+2代表a02的地址 a0+3代表a03的地址,a,a+1,a+2,a0,a0+1,a0+2,a0+3,行指针,列指针,列指针每加1,走一列,a1代表谁的地址? a1+1代表谁的地址? a1+2代表谁的地址? a1+3代表谁的地址?,a,a+1,a+2,a0,a0+1,a0+2,a0+3,行指针,列指针,ai+j代表谁的地址?,a,a+1,a+2,

30、a0,a0+1,a0+2,a0+3,行指针,列指针,代表aij的地址,*(ai+j)代表什么?,代表元素aij,*(*(a+i)+j)代表什么?,与*(ai+j)等价,例8.11 二维数组的有关数据(地址和值) #include int main() int a34=1,3,5,7,9,11,13,15, 17,19,21,23;,printf(“%d,%dn”,a,*a); printf(“%d,%dn”,a0,*(a+0); printf(“%d,%dn”, ,printf(“%d,%dn”,a,*a); printf(“%d,%dn”,a0,*(a+0); printf(“%d,%dn”

31、, ,printf(“%d,%dn”,a,*a); printf(“%d,%dn”,a0,*(a+0); printf(“%d,%dn”, ,2. 指向多维数组元素的指针变量 (1) 指向数组元素的指针变量 例8.12 有一个34的二维数组,要求用指向元素的指针变量输出二维数组各元素的值。,解题思路: 二维数组的元素是整型的,它相当于整型变量,可以用int*型指针变量指向它 二维数组的元素在内存中是按行顺序存放的,即存放完序号为0的行中的全部元素后,接着存放序号为1的行中的全部元素,依此类推 因此可以用一个指向整型元素的指针变量,依次指向各个元素,#include int main() int

32、 a34=1,3,5,7,9,11,13,15, 17,19,21,23; int *p; for(p=a0;pa0+12;p+) if(p-a0)%4=0) printf(“n”); printf(“%4d”,*p); printf(“n“); return 0; ,控制换行,逐个访问各元素时常用此类指针,(2) 指向由个元素组成的一维数组的指针变量 例8.13 输出二维数组任一行任一列元素的值。 解题思路:假设仍然用例8.12程序中的二维数组,例8.12中定义的指针变量是指向变量或数组元素的,现在改用指向一维数组的指针变量。,#include int main() int a34=1,3,

33、5,7,9,11,13,15, 17,19,21,23; int (*p)4,i,j; p=a; printf(“enter row and colum:“); scanf(“%d,%d”, ,行指针,aij,3. 用指向数组的指针作函数参数 一维数组名可以作为函数参数,多维数组名也可作函数参数。 用指针变量作形参,以接受实参数组名传递来的地址。 可以有两种方法: 用指向变量的指针变量 用指向一维数组的指针变量,例8.14 有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成绩。 解题思路:这个题目是很简单的。本例用指向数组的指针作函数参数。用函数average求总平均成绩,用函数

34、search找出并输出第i个学生的成绩。,#include int main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,70,60, 80,87,90,81,90,99,100,98; average(*score,12); search(score,2); return 0; ,score00的地址,void average(float *p,int n) float *p_end; float sum=0,aver; p_end=p+n-1; for( ;p=p_e

35、nd; p+) sum=sum+(*p); aver=sum/n; printf(“average=%5.2fn“,aver); ,p,p_end,p+1,#include int main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,70,60, 80,87,90,81,90,99,100,98; average(*score,12); search(score,2); return 0; ,二维数组首行地址,void search(float (*p)4,int n)

36、 int i; printf(“The score of No.%d are:n“,n); for(i=0;i4;i+) printf(“%5.2f “,*(*(p+n)+i); printf(“n“); ,p,p+2,例8.15 在上题基础上,查找有一门以上课程不及格的学生,输出他们的全部课程的成绩。 解题思路:在主函数中定义二维数组score,定义search函数实现输出有一门以上课程不及格的学生的全部课程的成绩,形参p的类型是float(*)4。在调用search函数时,用score作为实参,把score0的地址传给形参p。,#include int main() void search

37、(float (*p)4,int n); float score34=65,57,70,60, 58,87,90,81,90,99,100,98; search(score,3); return 0; ,void search(float (*p)4,int n) int i,j,flag; for(j=0;jn;j+) flag=0; for(i=0;i4;i+) if(*(*(p+j)+i)60) flag=1; if(flag=1) printf(“No.%d failsn“,j+1); for(i=0;i4;i+) printf(“%5.1f ”,*(*(p+j)+i); printf

38、(“n“); ,p,void search(float (*p)4,int n) int i,j,flag; for(j=0;jn;j+) flag=0; for(i=0;i4;i+) if(*(*(p+j)+i)60) flag=1; if(flag=1) printf(“No.%d failsn“,j+1); for(i=0;i4;i+) printf(“%5.1f ”,*(*(p+j)+i); printf(“n“); ,发现不及格,赋1,若有不及格,则输出,不用flag,而用break语句如何改程序?,8.4 通过指针引用字符串,8.4.1 字符串的引用方式 8.4.2 字符指针作函数

39、参数 8.4.3 使用字符指针变量和字符数组的比较,8.4.1 字符串的引用方式,字符串是存放在字符数组中的。引用一个字符串,可以用以下两种方法。 (1) 用字符数组存放一个字符串,可以通过数组名和格式声明“%s”输出该字符串,也可以通过数组名和下标引用字符串中一个字符。 (2) 用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。,例8.16 定义一个字符数组,在其中存放字符串“I love China!”,输出该字符串和第8个字符。 解题思路:定义字符数组string,对它初始化,由于在初始化时字符的个数是确定的,因此可不必指定数组的长度。用数组名string和输出格式%s可

40、以输出整个字符串。用数组名和下标可以引用任一数组元素。,#include int main() char string=“I love China!”; printf(“%sn”,string); printf(“%cn”,string7); return 0; ,string,string+7,例8.17 通过字符指针变量输出一个字符串。 解题思路:可以不定义字符数组,只定义一个字符指针变量,用它指向字符串常量中的字符。通过字符指针变量输出该字符串。,#include int main() char *string=“I love China!”; printf(“%sn”,string);

41、 return 0; ,string,char *string; string=” I love China!”;,#include int main() char *string=“I love China!”; printf(“%sn”,string); string=”I am a student.”; printf(“%sn”,string); return 0; ,string,#include int main() char *string=“I love China!”; printf(“%sn”,string); string=”I am a student.”; printf

42、(“%sn”,string); return 0; ,string,例8.18 将字符串a复制为字符串b,然后输出字符串b。 解题思路:定义两个字符数组a和b,用“I am a student.”对a数组初始化。将a数组中的字符逐个复制到b数组中。可以用不同的方法引用并输出字符数组元素,今用地址法算出各元素的值。,#include int main() char a =“I am a student.”,b20; int i; for(i=0;*(a+i)!=0;i+) *(b+i)=*(a+i); *(b+i)=0; printf(“string a is:%sn”,a); printf(“

43、string b is:“); for(i=0;bi!=0;i+) printf(“%c”,bi); printf(“n“); return 0; ,printf(“string b is:%sn“,b);,例8.19 用指针变量来处理例8.18问题。 解题思路:定义两个指针变量p1和p2,分别指向字符数组a和b。改变指针变量p1和p2的值,使它们顺序指向数组中的各元素,进行对应元素的复制。,#include int main() char a=“I am a boy.“,b20,*p1,*p2; p1=a; p2=b; for( ; *p1!=0; p1+,p2+) *p2=*p1; *p2

44、=0; printf(“string a is:%sn”,a); printf(“string b is:%sn”,b); return 0; ,8.4.2 字符指针作函数参数,如果想把一个字符串从一个函数“传递”到另一个函数,可以用地址传递的办法,即用字符数组名作参数,也可以用字符指针变量作参数。 在被调用的函数中可以改变字符串的内容 在主调函数中可以引用改变后的字符串。,8.4.2 字符指针作函数参数,例8.20 用函数调用实现字符串的复制。 解题思路:定义一个函数copy_string用来实现字符串复制的功能,在主函数中调用此函数,函数的形参和实参可以分别用字符数组名或字符指针变量。分别

45、编程,以供分析比较。,(1) 用字符数组名作为函数参数 #include int main() void copy_string(char from,char to); char a=“I am a teacher.“; char b=“you are a student.“; printf(“a=%snb=%sn“,a,b); printf(“copy string a to string b:n“); copy_string(a,b); printf(“a=%snb=%sn“,a,b); return 0; ,void copy_string(char from, char to) int

46、 i=0; while(fromi!=0) toi=fromi; i+; toi=0; ,(2)用字符型指针变量作实参 copy_string不变,在main函数中定义字符指针变量from和to,分别指向两个字符数组a,b。 仅需要修改主函数代码,#include int main() void copy_string(char from, char to); char a=“I am a teacher.”; char b=“you are a student.”; char *from=a,*to=b; printf(“a=%snb=%sn“,a,b); printf(“ncopy string a to string b:n“); copy_string(from,to); printf(“a=%snb=%sn“,a,b); return 0; ,(3)用字符指针变量作形参和实参,#include int main() void copy_string(char *from, char *to); char *a=“I am a teacher.”; char b=“You a

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1