第8章 指针_第1页
第8章 指针_第2页
第8章 指针_第3页
第8章 指针_第4页
第8章 指针_第5页
已阅读5页,还剩81页未读 继续免费阅读

下载本文档

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

文档简介

1、第第8章章 指针指针2021年年10月月27日星期三日星期三主要内容主要内容指针基础指针基础1指针与数组指针与数组2指针与字符串指针与字符串32021年年10月月27日星期三日星期三地址和指针的概念地址和指针的概念v 变量与地址变量与地址2021年年10月月27日星期三日星期三地址和指针的概念地址和指针的概念v 直接访问与间接访问直接访问与间接访问2021年年10月月27日星期三日星期三2021年年10月月27日星期三日星期三2021年年10月月27日星期三日星期三v 直接访问和间接访问直接访问和间接访问 这样在这样在i_pointer和变量和变量i之间建立起一种联系,即通过之间建立起一种联系

2、,即通过i_pointer能知道能知道i的地址,从而找到变量的地址,从而找到变量i的内存单元。(的内存单元。(“指向指向”关系)关系)20002000ii33i_pointer320002021年年10月月27日星期三日星期三地址和指针的概念地址和指针的概念v 指针与指针变量指针与指针变量变量变量i的地址,称为的地址,称为i的的存放地址的变量存放地址的变量称为称为2021年年10月月27日星期三日星期三v变量的变量的指针指针就是变量的就是变量的地址地址。v存放变量的地址的变量是存放变量的地址的变量是指针变量指针变量,用来指向另一个变量。,用来指向另一个变量。v为了表示指针变量和它所指向的变量之

3、间的联系,在程序中用为了表示指针变量和它所指向的变量之间的联系,在程序中用“* *”符号来表示符号来表示“指向指向”例:例:i_pointer代表指针变量,而代表指针变量,而*i_pointer是是i_pointer所所指向的变量。指向的变量。可以看到,可以看到, *i_pointer也代表一个变量,它和变量也代表一个变量,它和变量i是同一回是同一回事事 (i=3 ; *i_pointer=3;)地址和指针的概念地址和指针的概念2021年年10月月27日星期三日星期三地址和指针的概念地址和指针的概念v & 与与 * 运算符运算符: 取变量或存储单元的地址取变量或存储单元的地址i可以是任

4、意类型的变量或存储单元可以是任意类型的变量或存储单元: 取指针所指向的单元取指针所指向的单元 i_p只能是地址,或存放地址的变量只能是地址,或存放地址的变量(即指针或指针变量)(即指针或指针变量):指针变量指针变量:i_p所指向的变量(即所指向的变量(即i)2021年年10月月27日星期三日星期三地址和指针的概念地址和指针的概念v & 与与 * 运算符运算符 运算对象的个数:运算对象的个数:1个(单目运算符)个(单目运算符) 优先级:第优先级:第2级级 结合性:从右到左结合性:从右到左int i, *p;p=&i;下列表达式中错误的是下列表达式中错误的是&i &

5、p*i *p&*i *& i &*p *&p&i&p*i*p2021年年10月月27日星期三日星期三指针变量的定义指针变量的定义v 指针定义的一般形式指针定义的一般形式 基类型基类型* * 指针变量名指针变量名; ;说明:说明:v指针变量指针变量p1和和p2只能指向只能指向int变量,但不能指向变量,但不能指向float型或型或char型变量型变量v指针变量定义后,指针变量定义后,2021年年10月月27日星期三日星期三v怎样使一个指针变量怎样使一个指针变量指向指向另一个变量呢?另一个变量呢?int i,j;int * pointer_1,*po

6、inter_2;pointer_1=&i; pointer_2=&j;指针变量的定义指针变量的定义2021年年10月月27日星期三日星期三v理解指针变量的定义:理解指针变量的定义: *pointer_1和和*pointer_2是整型变量,如同是整型变量,如同“int a,b;”是定义是定义了了a和和b是整型变量一样。是整型变量一样。 *pointer_1 、*pointer_2是什么?是什么? pointer_1、 pointer_2是什么?是什么? 注意:注意:只有整型变量的地址才能放到指向整型变量的指针变量只有整型变量的地址才能放到指向整型变量的指针变量中。中。指针变量的定

7、义指针变量的定义2021年年10月月27日星期三日星期三指针变量的定义指针变量的定义void main( ) int i=10; int *p; *p=i; printf(%d, *p);随机随机:没有被赋初值,因此存放随机地址没有被赋初值,因此存放随机地址:可能指向任何地址单元可能指向任何地址单元void main( ) int i=10, ; int *p; ; *p=i; printf(%d, *p);输出输出10但是很危险!但是很危险!2021年年10月月27日星期三日星期三 指针指针 变量的地址变量的地址 指针变量指针变量 专门存放指针的变量专门存放指针的变量 如何定义一个指针变量?

8、如何定义一个指针变量? 问题:定义一个指向问题:定义一个指向int型变量的指针变量型变量的指针变量p int * p; 指向指向int型变量的指针型变量的指针int *p; 指向指向float型变量的指针型变量的指针float *p; 指向指向char型变量的指针型变量的指针char *p;复习复习2021年年10月月27日星期三日星期三指针变量的初始化指针变量的初始化v 一般形式:一般形式: 基类型基类型* * 指针变量名指针变量名 = = 初始地址值初始地址值; ;int i;int *p = &i;int *p = &i;int i;float i;int *p = &a

9、mp;i;int i;int *p = &i;int *q = p;赋给指针变量,赋给指针变量,不是赋给目标变量不是赋给目标变量用已初始化指针变量作初值用已初始化指针变量作初值变量必须与定义指针变量时变量必须与定义指针变量时说明的说明的一致一致2021年年10月月27日星期三日星期三指针变量的引用指针变量的引用#include void main() int a,b; int *pointer_1,*pointer_2; a=100;b=10; pointer_1=&a; pointer_2=&b; printf(“%d,%dn”,a,b); printf(“%d,%d

10、n”, *pointer_1, *pointer_2);2021年年10月月27日星期三日星期三指针示例指针示例a: 10&a: ffccp: ffcc*p: 10&p: ffd22021年年10月月27日星期三日星期三指针示例指针示例用指针实现:输入两个数,并使其从大到小输出用指针实现:输入两个数,并使其从大到小输出.5, 9 2021年年10月月27日星期三日星期三指针示例指针示例用指针实现:输入两个数,并使其从大到小输出用指针实现:输入两个数,并使其从大到小输出.max=9, min=55, 9 a=5, b=92021年年10月月27日星期三日星期三8.2.3指针变量的

11、赋值指针变量的赋值(1)对指针变量的赋值需要保持数据类型的一致)对指针变量的赋值需要保持数据类型的一致 例如:例如:float x; int *p; p = &x; (2)不能将一个常数值赋给指针变量)不能将一个常数值赋给指针变量 例如:例如:int *p; p= 3000; (3)指针变量可以被赋值为)指针变量可以被赋值为NULL或者零或者零 例如:例如:int *p; p= NULL; p = 0;222021年年10月月27日星期三日星期三8.2.3指针变量的赋值指针变量的赋值(4) &取地址运算符取地址运算符 例如:例如:int *p; p=&125; p=&a

12、mp;(x+y); (5) 允许使用赋值运算符进行指针的赋值运算允许使用赋值运算符进行指针的赋值运算例如:例如:int *p,*q,x=5; p=&x; q=p;但但 int *p, x=5; float *q; p=&x; q=p; 232021年年10月月27日星期三日星期三8.2.3指针变量的赋值指针变量的赋值指针变量的操作规则:指针变量的操作规则:(1)只有变量的地址才能存储在指针变量中。)只有变量的地址才能存储在指针变量中。(2)对指针变量的赋值需要保持数据类型的一致。)对指针变量的赋值需要保持数据类型的一致。(3)不要把变量的值和常数赋给指针变量。)不要把变量的值和

13、常数赋给指针变量。(4)指针变量在引用前必须初始化。)指针变量在引用前必须初始化。(5)只有相同类型的指针可以直接赋值)只有相同类型的指针可以直接赋值242021年年10月月27日星期三日星期三指针型函数指针型函数v 一个函数可以返回整型值、字符值、实型值等一个函数可以返回整型值、字符值、实型值等也可以也可以,即返回地址值,即返回地址值v 函数的定义形式:函数的定义形式:例例 其中:其中: f 是函数名,是函数名,调用调用f后,会得到一个后,会得到一个“* *”号表明这是一号表明这是一个指针型函数个指针型函数表示了返回的指针值所指表示了返回的指针值所指向单元的数据类型。向单元的数据类型。202

14、1年年10月月27日星期三日星期三指针型函数指针型函数void main() int a=2, b=3, *p; p = ; printf (%dn, *p);2021年年10月月27日星期三日星期三指针型函数指针型函数void main() int a=2, b=3, *p; p = ; printf (%dn, *p);32021年年10月月27日星期三日星期三指针型函数指针型函数void main() int a=2, b=3, *p; p = ; printf (%dn, *p);2021年年10月月27日星期三日星期三指针型函数指针型函数void main() int a=2, b=

15、3, *p; p = ; printf (%dn, *p);2021年年10月月27日星期三日星期三指针与数组指针与数组v 指向数组元素的指针:指向数组元素的指针:数组元素是内存的一个单元,故数组元素是内存的一个单元,故的性质的性质, ,与与是一样的。是一样的。int a10, *p;int a10, *p;int a10;2021年年10月月27日星期三日星期三指针与数组指针与数组v 指针变量的赋值运算:指针变量的赋值运算:int *p1, *p2, i, a10;int *p, i;2021年年10月月27日星期三日星期三指针与数组指针与数组v 指针变量的算术运算指针变量的算术运算:(当指

16、针变量指向数组元素时,算术运算才有意义)(当指针变量指向数组元素时,算术运算才有意义)int i, a10, *p=a;a0a1a2a3a4a5a6a7a8a9数组数组a: 就是就是ai的地址的地址也可以用也可以用表示表示即:即:就是数组元素就是数组元素ai也把也把*(p+i) 写作写作即:即:一定要掌握如下运算:一定要掌握如下运算:2021年年10月月27日星期三日星期三指针与数组指针与数组v 指针变量的算术运算指针变量的算术运算:(当指针变量指向数组元素时,算术运算才有意义)(当指针变量指向数组元素时,算术运算才有意义)int a10;int *p=&a2;p+;*p=1;a0a1

17、a2a3a4a5a6a7a8a9数组数组a2021年年10月月27日星期三日星期三指针与数组指针与数组v 指针变量的算术运算指针变量的算术运算:(当指针变量指向数组元素时,算术运算才有意义)(当指针变量指向数组元素时,算术运算才有意义)int a10;int *p1=&a2;int *p2=&a5;则:则:a0a1a2a3a4a5a6a7a8a9数组数组a若若p1与与p2指向同一数组指向同一数组p2-p1=两指针间元素个数两指针间元素个数(p2的值的值-p1的值的值)/d2021年年10月月27日星期三日星期三指针与数组指针与数组v 指针变量的关系运算指针变量的关系运算:(当指

18、针变量指向数组元素时,关系运算才有意义)(当指针变量指向数组元素时,关系运算才有意义)int a10;int *p1=&a2;int *p2=&a5;a0a1a2a3a4a5a6a7a8a9数组数组a2021年年10月月27日星期三日星期三指针与数组指针与数组v 指针变量的关系运算指针变量的关系运算:(当指针变量指向数组元素时,关系运算才有意义)(当指针变量指向数组元素时,关系运算才有意义)#include void main() int a10; int *p1=&a2; int *p2=&a5; printf(p1p2: %dn, p1p2: %dn, p1

19、p2); printf(p1=p2: %dn,p1=p2);a0a1a2a3a4a5a6a7a8a9数组数组ap1p2: 0p1=p2: 02021年年10月月27日星期三日星期三指针与数组指针与数组v 数组元素的表示方法数组元素的表示方法:(当指针变量指向数组元素时,关系运算才有意义)(当指针变量指向数组元素时,关系运算才有意义)int a10, *p=a; 如何表示如何表示a中第中第i+1个元素个元素(ai)?2021年年10月月27日星期三日星期三指针与数组指针与数组a0 a1 a2 a3 a4a0: 1a1: 2 a2: 3 a3: 4a4: 5p0: 1p1: 2 p2: 3 p3:

20、 4p4: 5*(a+0): 1*(a+1): 2 *(a+2): 3 *(a+3): 4*(a+4): 5*(p+0): 1*(p+1): 2 *(p+2): 3 *(p+3): 4*(p+4): 5*p: 1*p: 2 *p: 3 *p: 4*p: 5先计算元素地址,较费时先计算元素地址,较费时用指针变量直接指向元素,执行速度快用指针变量直接指向元素,执行速度快2021年年10月月27日星期三日星期三指针与数组指针与数组v 使用指针变量时要注意的问题使用指针变量时要注意的问题: 指针变量的值可以改变指针变量的值可以改变 数组名的值是地址常量,不可改变数组名的值是地址常量,不可改变int a

21、=1, 2, 3, 4, 5, *p=a, i=3;的正确表示是:的正确表示是:(A)&(a+1) (B)a+ (C)&p (D)&pip+, p- a+, a- a+1, *(a+2) 2021年年10月月27日星期三日星期三指针与数组指针与数组v 使用指针变量时要注意的问题使用指针变量时要注意的问题: 注意指针变量的当前值注意指针变量的当前值#include void main() int i, a5, *p; p = a; 43210-30-32149160-28239219804128521337p p p p p 1 2 3 4 5 -28 0 14916 3

22、2 -30p 2021年年10月月27日星期三日星期三指针与数组指针与数组v 使用指针变量时要注意的问题使用指针变量时要注意的问题: 注意指针变量的当前值注意指针变量的当前值#include void main() int i, a5, *p; p = a; p p p p p 1 2 3 4 5 1 2 3 4 5p p 43210-30-32149160-282392198041285213372021年年10月月27日星期三日星期三指针与数组指针与数组v 使用指针变量时要注意的问题使用指针变量时要注意的问题: 指针变量的复杂运算指针变量的复杂运算#include void main()

23、int a=1,2,3,4,5,6,7,8,9,10; int y, *p=&a1; printf(y=%dn,y); printf(a%d=%d, p-a, ap-a);p y=3a2=3p 9876543210109876543212021年年10月月27日星期三日星期三指针与数组指针与数组v 使用指针变量时要注意的问题使用指针变量时要注意的问题: 指针变量的复杂运算指针变量的复杂运算#include void main() int a=1,2,3,4,5,6,7,8,9,10; int y, *p=&a1; printf(y=%dn,y); printf(a%d=%d,

24、p-a, ap-a);p y=2a2=3p 9876543210109876543212021年年10月月27日星期三日星期三指针与数组指针与数组v 使用指针变量时要注意的问题使用指针变量时要注意的问题: 指针变量的复杂运算指针变量的复杂运算#include void main() int a=1,2,3,4,5,6,7,8,9,10; int y, *p=&a1; printf(y=%dn,y); printf(a%d=%d, p-a, ap-a);y=2a1=3p 9876543210109876543212021年年10月月27日星期三日星期三指针与数组指针与数组v 使用指针变量

25、时要注意的问题使用指针变量时要注意的问题: 指针变量的复杂运算指针变量的复杂运算#include void main() int a=1,2,3,4,5,6,7,8,9,10; int y, *p=&a1; printf(y=%dn,y); printf(a%d=%d, p-a, ap-a);y=1a0=2p 987654321010987654321p 2021年年10月月27日星期三日星期三指针与数组指针与数组v 总结总结(一维数组与一级指针的关系)(一维数组与一级指针的关系) 与与 ;数组名数组名 若若p=a,则则p+i是是ai的地址的地址(即(即) 数组元素的表示方法:下标法数

26、组元素的表示方法:下标法和和指针法,指针法,若若p=a,则则: 系统只给系统只给p分配能保存一个指针值的内存区(一般分配能保存一个指针值的内存区(一般4字节)字节)而给而给a分配分配4*10字节的内存区字节的内存区2021年年10月月27日星期三日星期三指针与数组指针与数组v 用数组名作函数参数用数组名作函数参数:实际上,实际上,main() int arr10, i; f (arr, 10);main() int arr10, i; f (arr, 10);2021年年10月月27日星期三日星期三a数组数组1a02a13a24a35a46a57a68a79a810a9指针与数组指针与数组v

27、用数组名作函数参数用数组名作函数参数:#include void main() int i, j, a10=1,2,3,4,5,6,7,8,9,10; int m=10/2, temp; for(i=0; im; i+) j=9-i; temp=ai; ai=aj; aj=temp; for(i=0;i10;i+) printf(%d ,ai); printf(n);void main() int i, j, a10=1,2,3,4,5,6,7,8,9,10; ; for(i=0;i10;i+) printf(%d ,ai); printf(n);形参数组名接收实参传递的形参数组名接收实参传递

28、的数组首地址数组首地址实际上,实际上,void main() int i, j, a10=1,2,3,4,5,6,7,8,9,10; ; for(i=0;i10;i+) printf(%d ,ai); printf(n);实参数组名代表数组的首地址实参数组名代表数组的首地址2021年年10月月27日星期三日星期三例例 int a34=1,3,5,7,9,11,13,15,17,19,21,23; a0a1a2a2000a+12008a+22032a0 a0+1 a0+2 a0+3二维数组二维数组a有有3行,每一行地址分别为:行,每一行地址分别为:2000,2016,2032。二维数组二维数组a

29、有有12个元素,每一个元素的地址分别为:个元素,每一个元素的地址分别为:2000,2004,2008,2012,2016,2020,2024,2032。其中:其中:a00的地址值与的地址值与a的第的第0行地址相同,行地址相同,a10的地址值与的地址值与a的第的第1行地址相同,行地址相同,a20的地址值与的地址值与a的第的第2行地址相同,但它们的意义不同。行地址相同,但它们的意义不同。指针与数组指针与数组 1 3 5 7 9 11 13 15 17 19 21 232021年年10月月27日星期三日星期三(1)用变量地址表示:用变量地址表示: &aij (i=0,1,2;j=0,1,2,

30、3)(2)将二维数组看成一个由将二维数组看成一个由12个元素组成的一维数组,元素的地址个元素组成的一维数组,元素的地址为:为:a0+i*4+j或或 *a+i*4+j (i=0,1,2;j=0,1,2,3) 其中:其中:a0和和*a是是12个元素组成的一维数组名,表示首元素个元素组成的一维数组名,表示首元素a00的地址。的地址。(3)将二维数组看成由将二维数组看成由3个一维数组组成,元素的地址为:个一维数组组成,元素的地址为: (*(a+i)+j) (i=0,1,2;j=0,1,2,3) 其中:其中:a+i是第是第i行的地址,行的地址,*(a+i) 是第是第i行的首元素行的首元素ai0地址地址(

31、&ai0), *(a+i)+j是第是第i行的第行的第j个元素个元素aij地址地址(&aij)。)。二维数组元素的地址的各种表示方法二维数组元素的地址的各种表示方法2021年年10月月27日星期三日星期三有了数组元素的地址后,用指针运算有了数组元素的地址后,用指针运算*可以得到相应的数组元素。即可以得到相应的数组元素。即二维数组元素变量二维数组元素变量aij还可以用以下还可以用以下3种表示方法:种表示方法:(1)*(&aij) i=0,1,2;j=0,1,2,3。(2)*(a0+i*4+j)或或 *(*a+i*4+j) i=0,1,2;j=0,1,2,3。其中:其中:4是

32、每一行中元素的个数。是每一行中元素的个数。(3)*(*(a+i)+j) i=0,1,2;j=0,1,2,3指针与数组指针与数组2021年年10月月27日星期三日星期三#include void main() int *p,k=0; int a34=1,3,5,7, 9,11,13,15, 17,19,21,23; p=&a00; while(k12) printf(“%4d”,*p+); if (+k %4=0) printf(“n”);1 3 5 7 9 11 13 15 17 19 21 23aa2a1a01 3 5 7 1 3 5 7 9 11 13 159 11 13 1517

33、 19 21 2317 19 21 23p2021年年10月月27日星期三日星期三指针数组指针数组v 我们一共会学习三种数组:我们一共会学习三种数组:一般数组、指针数组、结构体数组一般数组、指针数组、结构体数组v 指针数组是指:指针数组是指:v 定义形式:定义形式:示例:示例:int * p 4区分区分 与与 int *p4:定义了一个指针数组,定义了一个指针数组, 每个数组元素都是一个指向整型数据的指针每个数组元素都是一个指向整型数据的指针int (*p) 4:定义了一个指针变量定义了一个指针变量 该指针变量指向一个长度为该指针变量指向一个长度为4的一维数组的一维数组2021年年10月月27

34、日星期三日星期三 p1 p0* p2指针数组指针数组v 指针数组的赋值指针数组的赋值main() int a23=1,2,3,4,5,6; int ; ; a12 a11 a10 a02 a01 a00654321a23#include void main() int a23=1,2,3,4,5,6; int ; ; 2021年年10月月27日星期三日星期三#include void main() 指针数组指针数组v 指针数组的赋值指针数组的赋值0nartroF0psiL0cisaBffbaffc2ffc8p3p2p1p0 720ffe21456676fffbaffc2ffc80ffba: F

35、ortranffc2: Lispffc8: Basic0: #include void main() 2021年年10月月27日星期三日星期三指针数组指针数组v 二维数组与指针数组的区别二维数组与指针数组的区别gain 0much 0stronger 0point0bye 0 0niag0hcum0regnorts0eyb0tniopname4name3name2name1name02021年年10月月27日星期三日星期三指针数组指针数组(选择排序)(选择排序)v 定义指针数组定义指针数组name5,每个元素分别指向一个字符串每个元素分别指向一个字符串v 按照字典顺序,选择出最小的字符串所对应

36、的指针按照字典顺序,选择出最小的字符串所对应的指针namek将其与将其与name0的指向互换,即实现了使的指向互换,即实现了使name0指向最小的指向最小的字符串字符串v 依次执行,分别将依次执行,分别将name1指向次小的字符串,指向次小的字符串,name2指向指向再次小的字符串再次小的字符串 v 依次输出依次输出name0name4所指向的字符串所指向的字符串2021年年10月月27日星期三日星期三指针数组指针数组(选择排序)(选择排序)2021年年10月月27日星期三日星期三指针数组指针数组(选择排序)(选择排序)2021年年10月月27日星期三日星期三指针数组指针数组(选择排序)(选择

37、排序)2021年年10月月27日星期三日星期三指针数组指针数组(选择排序)(选择排序)#include void main() char *name=Follow me, BASIC, Great Wall, FORTRAN, Computer , *temp; int i, j, k; for (i=0; i5; i+)printf(%sn, namei);2021年年10月月27日星期三日星期三指针与数组指针与数组v 二维数组与指针二维数组与指针: 教材上介绍了教材上介绍了的使用,自学,不作要求的使用,自学,不作要求 若要用指针处理二维数组,要求能够若要用指针处理二维数组,要求能够即:将二

38、维数组看作一维数组,用一级指针即:将二维数组看作一维数组,用一级指针* *p p实现实现2021年年10月月27日星期三日星期三小结小结定义定义含含 义义int i; int *p ;int an; int *pn; int (*p)n;int f();int *f(); int (*p)();int *p; 指针的数据类型指针的数据类型2021年年10月月27日星期三日星期三指针与字符串指针与字符串v 字符串的处理:字符串的处理:用用实现实现#include void main() char =I love China!; printf(%sn, str); printf(%sn, str+

39、7);I love China!China! str13 str12 str11 str10 str9 str8 str7 str6 str5 str4 str3 str2 str1 str00!anihCevolI2021年年10月月27日星期三日星期三指针与字符串指针与字符串v 字符串的处理:字符串的处理:用用实现实现#include void main() char =I love China!; printf(%sn, str); printf(%sn, str+7);I l o v e China!0I love China!China!2021年年10月月27日星期三日星期三指针与

40、字符串指针与字符串ffc0Hffc1ello0.cp0olleH2021年年10月月27日星期三日星期三指针与字符串指针与字符串v 总结总结(字符指针变量与字符数组的比较)(字符指针变量与字符数组的比较) 与与 ,每个元素存放一个字符,每个元素存放一个字符,存放字符串的首地址,存放字符串的首地址2021年年10月月27日星期三日星期三指针与字符串指针与字符串v 总结总结(字符指针变量与字符数组的比较)(字符指针变量与字符数组的比较) 与与 #include void main() char =I love China!; ; printf(%sn, cp);#include void main

41、() char =I love China!; ; printf(%sn, str);2021年年10月月27日星期三日星期三指针与字符串指针与字符串v 总结总结(字符指针变量与字符数组的比较)(字符指针变量与字符数组的比较) 与与 定义字符数组定义字符数组 str 时,为它分配了存储空间,时,为它分配了存储空间, 在定义字符指针变量在定义字符指针变量 cp 时,分配了时,分配了cp所在的内存单元,所在的内存单元,但是并未对其赋初始地址值,但是并未对其赋初始地址值, char ; scanf (%s, str); char ; scanf (%s, cp); char , ; ; scanf

42、(%s, cp);2021年年10月月27日星期三日星期三例例1:统计输入字符串的长度。:统计输入字符串的长度。#include void main( ) char str80,*p; scanf(“%s”,str); p=str;str x y z 0 printf(“The string length:%dn”,p-str);while(*p) p+ ;p指针与字符串指针与字符串ppp2021年年10月月27日星期三日星期三Banana0指针与字符串指针与字符串Pear0fromto0raePa=Pearb=Bananaa=Pearb=Pearvoid main() char a=Pear

43、; char b=Banana; printf(a=%snb=%sn, a, b); ; printf(a=%snb=%sn, a, b);方法方法1:用:用作函数参数作函数参数2021年年10月月27日星期三日星期三Banana0指针与字符串指针与字符串Pear0fromtofromtofromtotofromfromto0raePa=Pearb=Bananaa=Pearb=Pearvoid main() char a=Pear; char b=Banana; printf(a=%snb=%sn, a, b); ; printf(a=%snb=%sn, a, b);void main() c

44、har a=Pear; char b=Banana; printf(a=%snb=%sn, a, b); ; printf(a=%snb=%sn, a, b);void main() char ; char ; printf(a=%snb=%sn, a, b); ; printf(a=%snb=%sn, a, b);方法方法2:用:用作函数参数作函数参数2021年年10月月27日星期三日星期三常用字符处理函数常用字符处理函数v字符串连接函数字符串连接函数把字符串把字符串2连到字符串连到字符串1后面后面字符数组字符数组1的首地址的首地址字符数组字符数组1必须足够大必须足够大连接前,两字符串均以连

45、接前,两字符串均以0结束结束连接后,字符串连接后,字符串1中的中的0取消,保留字符串取消,保留字符串2的的0void main() char str110=How ;char str25=are;puts(str1);puts(str2); How are are0era0woH0erawoH2021年年10月月27日星期三日星期三常用字符处理函数常用字符处理函数v字符串拷贝函数字符串拷贝函数将字符串将字符串2,拷贝到字符串,拷贝到字符串1中去中去字符数组字符数组1的首地址的首地址字符数组字符数组1必须足够大必须足够大 拷贝时,拷贝时,0 一起拷贝一起拷贝 char , str210; ; ;

46、 ;2021年年10月月27日星期三日星期三常用字符处理函数常用字符处理函数v字符串拷贝函数字符串拷贝函数 #include #include void main() char tc10; char b = , c= C;char t = Turbo; printf(%sn, tc);!9y8G7:6&5(4342$10tc!9y8G7:605o4b3r2u1T0!9y8G706 5o4b3r2u1T0!9y807C6 5o4b3r2u1T0 Turbo C0obruT0C0 bct2021年年10月月27日星期三日星期三常用字符处理函数常用字符处理函数v字符串比较函数字符串比较函数比

47、较字符串比较字符串1和和字符串字符串2对两串从左向右逐个字符比较(对两串从左向右逐个字符比较(ASCII码),码), 直到遇到直到遇到不同字符不同字符或或0为止为止返回返回int型整数型整数 (1) 若字符串若字符串1 字符串字符串2,返回,返回 (3) 若字符串若字符串1 = 字符串字符串2,返回,返回,必须用必须用strcmp比较字符串的大小比较字符串的大小: 返回值:返回值:-1(A - B)返回值:返回值:32(a - A)返回值:返回值:67(C - 0 )返回值:返回值:20(u - a)返回值:返回值:-53(0 - 5)2021年年10月月27日星期三日星期三常用字符处理函数常

48、用字符处理函数v字符串长度函数字符串长度函数计算字符串长度计算字符串长度例例 对于以下字符串,对于以下字符串,strlen(s)的值为:的值为:(1)char s10=A, 0, B, C, 0, D;(2)char s=tb0willn;(3)char s=x69082n; 1(A)3 (tb)1 (i)2021年年10月月27日星期三日星期三字符数组举例字符数组举例v不使用不使用strlen() ,编程实现,编程实现:求一个字符串的长度:求一个字符串的长度定义一个一维字符数组定义一个一维字符数组s100输入一个字符串输入一个字符串求求第一个第一个0前的字符个数前的字符个数,即字符串长度,即

49、字符串长度输出字符串的长度输出字符串的长度#include void main() char s100;int i=0, slen=0;printf(Pleas input the string:n);scanf (%s, s);while (si != 0)slen +;i+; printf(The length of string is: %dn, slen); Please input the string:Hello The length of string is 5 Please input the string:How are you? The length of string i

50、s 32021年年10月月27日星期三日星期三字符数组举例字符数组举例v不使用不使用strcat() ,编程实现,编程实现:连接两个字符串:连接两个字符串定义两个一维字符数组定义两个一维字符数组a100, b50输入这两个字符串输入这两个字符串从字符数组从字符数组a的第一个的第一个0开始,开始,将字符数组将字符数组b中中0之前的字符一一复制之前的字符一一复制输出字符串输出字符串a和字符串和字符串b0zyx0dcba0zyxdcba#include void main() char a100, b50;int i=0, j=0;printf(Pleas input 2 string:n);scanf (%s%s, a, b);while (ai != 0) i+; while (bj != 0) ai=bj;i+; j+; (ai+=bj+;)ai=0;printf(a: %snb: %sn, a, b); Please input 2 string:abcd xyz a: abcdxyzb: xyz0zyx0dcba0zyxdcba2021年年

温馨提示

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

评论

0/150

提交评论