培训演讲稿二

上传人:M****1 文档编号:585706747 上传时间:2024-09-03 格式:PPT 页数:35 大小:996.03KB
返回 下载 相关 举报
培训演讲稿二_第1页
第1页 / 共35页
培训演讲稿二_第2页
第2页 / 共35页
培训演讲稿二_第3页
第3页 / 共35页
培训演讲稿二_第4页
第4页 / 共35页
培训演讲稿二_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《培训演讲稿二》由会员分享,可在线阅读,更多相关《培训演讲稿二(35页珍藏版)》请在金锄头文库上搜索。

1、主讲人:曹宣俊C+面向对象程序设计面向对象程序设计2024/9/32024/9/3目录目录v指针v常用字符串处理函数v函数v课后习题2024/9/3指针指针指针是一种数据类型,具有指针类型的变量称为指针变量。一个指针变量所存储的信息是一个对象在内存中的地址。通过指针可以间接地访问对象。每一个指针变量都有一个相应的基类型。基类型用以说明这个指针所指向的地址中存放数据的数据类型。2024/9/32024/9/3指针指针基类型基类型* 指针变量指针变量int*pi 指向指向int型的指针型的指针float* pl;指向;指向float型的指针型的指针char* pc;指向;指向char型的指针型的指

2、针char (*pa)3指向一维数组的指针指向一维数组的指针int(*pf)();指向函数的指针)();指向函数的指针int*pp;指向指针的指针;指向指针的指针2024/9/32024/9/3指针指针一个指针所占的内存空间大小与一个内存一个指针所占的内存空间大小与一个内存地址所占空间相等地址所占空间相等32位机器中指针占有四个字节位机器中指针占有四个字节即即int* pi 和和double* pd都一样都占有四个字都一样都占有四个字节节2024/9/32024/9/3指针的用法指针的用法错误用法一错误用法一intint* p* p;* *p=10p=10;为什么出错呢?这是因为指针也是一个变

3、量,在执行为什么出错呢?这是因为指针也是一个变量,在执行intint* p* p 语句时,只给语句时,只给p p分配了空间,它是一个长度是分配了空间,它是一个长度是4 4个字节的地址空间,并没有分配它指向的空间,也就个字节的地址空间,并没有分配它指向的空间,也就是说,是说,p p的值是一个没有意义的地址值,显然的值是一个没有意义的地址值,显然* *p p也是也是没有意义的,当执行没有意义的,当执行 * *p=10p=10; 语句时肯定出错,改语句时肯定出错,改正的方法是先分配平指向的空间,再赋值正的方法是先分配平指向的空间,再赋值 intint* p=new * p=new intint;*

4、*p=10p=10 2024/9/32024/9/3指针的用法指针的用法错误用法二错误用法二 上面的语句是否可以写成这样呢?上面的语句是否可以写成这样呢?上面的语句是否可以写成这样呢?上面的语句是否可以写成这样呢?intint* p=10* p=10;注意:注意:注意:注意:p p是一个指针变量,不能赋常量值。是一个指针变量,不能赋常量值。是一个指针变量,不能赋常量值。是一个指针变量,不能赋常量值。但是以下语句是正确的:但是以下语句是正确的:但是以下语句是正确的:但是以下语句是正确的:char* p=“string”char* p=“string”;这这这这是是是是因因因因为为为为计计计计算算

5、算算机机机机先先先先给给给给字字字字符符符符串串串串“string”“string”分分分分配配配配一一一一个个个个空空空空间间间间,并并并并将将将将其其其其首首首首地地地地址址址址赋赋赋赋值值值值给给给给p p。但但但但是是是是要要要要注注注注意意意意的的的的是是是是p p指指指指向向向向的是单个字符,如以下语句的是单个字符,如以下语句的是单个字符,如以下语句的是单个字符,如以下语句coutcout“*p”*p“*p”*pendlendl; ;只输出只输出只输出只输出s s,要想输出整个字符串,应该为:,要想输出整个字符串,应该为:,要想输出整个字符串,应该为:,要想输出整个字符串,应该为:

6、coutcout“p=”p“p=”pendlendl; ;2024/9/32024/9/3指针的用法指针的用法前面列举了两种可能误用指针的例子从前面的例子可以看出指针使用的繁琐,从前面的例子可以看出指针使用的繁琐,但是为什么还要使用指针呢?但是为什么还要使用指针呢?原因:原因:1 指针和数组相比,如果利用下标访指针和数组相比,如果利用下标访问元素,指针比数组要处理起来快问元素,指针比数组要处理起来快2024/9/32024/9/3一维指针数组的指针表示法一维指针数组的指针表示法Int a5;/a是一维数组名,它有五个是一维数组名,它有五个int型型变量。变量。当用指针表示时,当用指针表示时,*

7、(a+i)与)与ai(其中其中,i=1,2,3,4,5)是相同的。常量指针与变量指是相同的。常量指针与变量指针是有区别的。例如:针是有区别的。例如:int a10,*p;p=a;表达式表达式p+1,a+2,p=p+1,p-a等都是合法等都是合法的;而表达式的;而表达式a=a+1,a=a-1等是非法的。等是非法的。为什么?为什么?2024/9/32024/9/3二维指针数组的指针表示法二维指针数组的指针表示法 例如:例如:例如:例如:intint b23;/b b23;/b是二维数组名,它有个是二维数组名,它有个是二维数组名,它有个是二维数组名,它有个intint型变量型变量型变量型变量当用指针

8、表示时,当用指针表示时,当用指针表示时,当用指针表示时,* *(* *(b+ib+i)+j+j)与)与)与)与bijbij ( (其中其中其中其中i=0i=0,1 1;j=0,1,2)j=0,1,2)是相同的。一个二维数组可以看成是相同的。一个二维数组可以看成是相同的。一个二维数组可以看成是相同的。一个二维数组可以看成是一个一维数组,即行数组,每个元素(即每个行数组)是一个一维数组,即行数组,每个元素(即每个行数组)是一个一维数组,即行数组,每个元素(即每个行数组)是一个一维数组,即行数组,每个元素(即每个行数组)又是具有又是具有又是具有又是具有3 3个元素的一维数组,称为列数组。因此,个元素

9、的一维数组,称为列数组。因此,个元素的一维数组,称为列数组。因此,个元素的一维数组,称为列数组。因此,b23b23可以看成可以看成可以看成可以看成2 2个元素的一维行数组和个元素的一维行数组和个元素的一维行数组和个元素的一维行数组和3 3个元素的一维个元素的一维个元素的一维个元素的一维 数组,称为列数组。因此,数组,称为列数组。因此,数组,称为列数组。因此,数组,称为列数组。因此,b23b23可以看成为可以看成为可以看成为可以看成为2 2个元素个元素个元素个元素的一维行数组和的一维行数组和的一维行数组和的一维行数组和3 3个元素的一维列数组组成。前面讲过个元素的一维列数组组成。前面讲过个元素的

10、一维列数组组成。前面讲过个元素的一维列数组组成。前面讲过了一维数组的指针表示,将二维数组的行,列的一维数了一维数组的指针表示,将二维数组的行,列的一维数了一维数组的指针表示,将二维数组的行,列的一维数了一维数组的指针表示,将二维数组的行,列的一维数组都用指针表示,便得到如下形式:组都用指针表示,便得到如下形式:组都用指针表示,便得到如下形式:组都用指针表示,便得到如下形式:* *(*(*(b+i)+jb+i)+j) )2024/9/32024/9/3二维指针数组的指针表示法二维指针数组的指针表示法数据的一种重要表现形式,常量的值不可改变,数据的一种重要表现形式,常量的值不可改变,数据的一种重要

11、表现形式,常量的值不可改变,数据的一种重要表现形式,常量的值不可改变,这是个二级指针。再将二维数组的行数组用下标表这是个二级指针。再将二维数组的行数组用下标表这是个二级指针。再将二维数组的行数组用下标表这是个二级指针。再将二维数组的行数组用下标表示,列数组用指针表示,得到如下形式:示,列数组用指针表示,得到如下形式:示,列数组用指针表示,得到如下形式:示,列数组用指针表示,得到如下形式:*( *(bi+jbi+j) )再将二维数组的行数组用指针表示,列数组用下标再将二维数组的行数组用指针表示,列数组用下标再将二维数组的行数组用指针表示,列数组用下标再将二维数组的行数组用指针表示,列数组用下标表

12、示,又得到如下形式:表示,又得到如下形式:表示,又得到如下形式:表示,又得到如下形式:(*(*(b+i)jb+i)j 另外按照二维数组在内存中的排放顺序,用指向数另外按照二维数组在内存中的排放顺序,用指向数另外按照二维数组在内存中的排放顺序,用指向数另外按照二维数组在内存中的排放顺序,用指向数组首元素的一级指针表示如下:组首元素的一级指针表示如下:组首元素的一级指针表示如下:组首元素的一级指针表示如下: * *(&b00+3*(&b00+3*i+ji+j) )2024/9/32024/9/3常用字符串处理函数常用字符串处理函数 char* char* strstr(conststrstr(co

13、nst char* char* srcstr,constsrcstr,const char* char* substrsubstr) ); 应用举例:应用举例:char* char* substrsubstr=“sip:”; =“sip:”; char* char* srcstrsrcstr=“http:sip:80810.164.204.148:26780;lr.sip:8084=“http:sip:80810.164.204.148:26780;lr.sip:”;”;char* char* startstrstartstr= =strstr(srcstr,substrstrstr(srcs

14、tr,substr); );char* char* endstrendstr= =strstr(srcstrstrstr(srcstr.”);.”);intint lenlen=endstr-startstr-4;=endstr-startstr-4;char servicekey8=0; char servicekey8=0; memcpy(servicekey,startstr+4,len) memcpy(servicekey,startstr+4,len) coutcoutservicekeyservicekeyendlendl; ;2024/9/32024/9/3常用字符串处理函数常用

15、字符串处理函数 char* char* strtok(charstrtok(char*,const char*);*,const char*); char char t_sept_sep=|; =|; char *char *ptokenptoken = NULL; = NULL; char char countrycodecountrycode=86|89|973;=86|89|973; ptokenptoken = = strtok(countrycodestrtok(countrycode , , t_sept_sep); ); boolbool t_bExistt_bExist = f

16、alse; = false; while ( while ( ptokenptoken != NULL ) != NULL ) if ( strcmp(ptoken,973) = 0 )/ if ( strcmp(ptoken,973) = 0 )/对比国家码对比国家码 t_bExistt_bExist = true ; = true ; break;break; ptokenptoken = = strtokstrtok( NULL, ( NULL, t_sept_sep); / ); / if(t_bExistif(t_bExist) ) coutcout存在存在endlendl; ; e

17、lseelse coutcout不存在不存在endlendl; ; 2024/9/32024/9/3变量作用域变量作用域 在在C+C+中,所定义的变量分为局部变量和全部变量中,所定义的变量分为局部变量和全部变量 局部变量局部变量 局部变量是指作用域在函数级和块级的变量。包含有自动变量(局部变量是指作用域在函数级和块级的变量。包含有自动变量(autoauto)和内部)和内部静态变量(静态变量(staticstatic)以及函数参数以及函数参数自动变量是定义在函数体内或分程序内,定义时可以加说明符自动变量是定义在函数体内或分程序内,定义时可以加说明符autoauto,也可以省,也可以省略,所以,在

18、程序中无特殊说明的变量都默认为自动变量。由于自动变量略,所以,在程序中无特殊说明的变量都默认为自动变量。由于自动变量以堆栈方式占用内存空间,因此在运行到此作用域时,系统会立刻为这个以堆栈方式占用内存空间,因此在运行到此作用域时,系统会立刻为这个变量分配内存空间,而程序运行后,这个堆栈立即被系统回收,即这个变变量分配内存空间,而程序运行后,这个堆栈立即被系统回收,即这个变量会消失。量会消失。与自动变量作用域相同的另一种变量是寄存器,这种变量也是定义在函数体内与自动变量作用域相同的另一种变量是寄存器,这种变量也是定义在函数体内或者分程序内,定义时前面加或者分程序内,定义时前面加registerre

19、gister。寄存器类变量有可能被存放在。寄存器类变量有可能被存放在CPUCPU的通用内存中,这样可提高存取速度,如果没被存放在通用内存,便会按的通用内存中,这样可提高存取速度,如果没被存放在通用内存,便会按照自动变量处理。能否存放在通用寄存器中,取决于通用寄存器是否空闲。照自动变量处理。能否存放在通用寄存器中,取决于通用寄存器是否空闲。定义寄存器变量时,应注意一下几点:定义寄存器变量时,应注意一下几点:(1 1)该变量的数据长度与通用寄存器的长度相当,一般是)该变量的数据长度与通用寄存器的长度相当,一般是charchar或者或者intint(2 2)寄存器变量不宜太多,因为通用寄存器数量毕竟

20、有限)寄存器变量不宜太多,因为通用寄存器数量毕竟有限(3 3)要选择使用频率相当的变量作为寄存器变量,例如,多重循环的内重循)要选择使用频率相当的变量作为寄存器变量,例如,多重循环的内重循环变量等。环变量等。2024/9/32024/9/3变量作用域变量作用域内部变量是定义在函数体内或者分程序内,并且内部变量是定义在函数体内或者分程序内,并且用说明符用说明符staticstatic说明的一种变量。说明的一种变量。它的作用和自动变量相同。但是它的作用和自动变量相同。但是C+C+编译器以固编译器以固定地址存放这个变量,而不是以堆栈存放。因此定地址存放这个变量,而不是以堆栈存放。因此只要整个程序在运

21、行,这个变量就会存在。只要整个程序在运行,这个变量就会存在。内部静态变量定义函数体内,它的作用域定义在内部静态变量定义函数体内,它的作用域定义在它的函数体内或分程序内,然而在定义它的作用它的函数体内或分程序内,然而在定义它的作用域外,虽然不可见,但仍然存在,没有被释放掉,域外,虽然不可见,但仍然存在,没有被释放掉,一旦回到它的作用域后,它仍然保留其原有的值。一旦回到它的作用域后,它仍然保留其原有的值。理解了这个特点后,便会分析和选用适当的变量理解了这个特点后,便会分析和选用适当的变量类型了。类型了。2024/9/32024/9/3静态变量示例程序静态变量示例程序void func(int v)

22、static int value=v;coutvalue:valueendl;func(2);func(4);2024/9/32024/9/3全局变量全局变量 全局变量是指作用域在程序级或文件级的变量。包括外部变量和外全局变量是指作用域在程序级或文件级的变量。包括外部变量和外部静态变量。部静态变量。外部变量的作用域是程序级的,即在一个文件定义的外部变量,在外部变量的作用域是程序级的,即在一个文件定义的外部变量,在该程序的其它文件中是可以用的,外部变量定义在函数体外,定义该程序的其它文件中是可以用的,外部变量定义在函数体外,定义任何存储类型说明,外部变量在引用其需要说明,说明外部变量时任何存储类

23、型说明,外部变量在引用其需要说明,说明外部变量时应在其前面加说明符应在其前面加说明符externextern,表示该变量时外部变量。在一个文件,表示该变量时外部变量。在一个文件中,先引用后定义的外部变量引用前必须说明,这称为外部变量提中,先引用后定义的外部变量引用前必须说明,这称为外部变量提前说明,在一个文件中定义的外部变量在另一个文件中要引用,则前说明,在一个文件中定义的外部变量在另一个文件中要引用,则在其前必须说明。可见,外部变量的定义和说明是两回事,在一个在其前必须说明。可见,外部变量的定义和说明是两回事,在一个程序中,一个外部变量只能定义一次,但是可以说明多次。程序中,一个外部变量只能

24、定义一次,但是可以说明多次。内部静态变量定义时时有默认值的,内部静态变量定义时时有默认值的,intint为为0 0,浮点型为,浮点型为0.00.0,charchar为空。为空。外部变量和外部静态变量也是如此,但是自动变量和寄存器变量定外部变量和外部静态变量也是如此,但是自动变量和寄存器变量定义后没赋值,是不会有默认值的。义后没赋值,是不会有默认值的。2024/9/32024/9/3函数函数函数的定义和说明函数的定义和说明在在C+中,定义函数的格式如下中,定义函数的格式如下数据类型数据类型 函数名(参数表)函数名(参数表)语句序列;语句序列;2024/9/32024/9/3函数的定义和说明示例程

25、序示例程序示例程序示例程序计算计算计算计算1+2+1001+2+100intintsumsum(intint n n) intint i,si,s=0;=0; for(ifor(i=1;i=1;i=n;+in;+i) )s+=i;s+=i;return s;return s; 2024/9/32024/9/3函数的定义和说明定义函数时,参数表中的参数称为形式参数,简定义函数时,参数表中的参数称为形式参数,简定义函数时,参数表中的参数称为形式参数,简定义函数时,参数表中的参数称为形式参数,简称形参。形参在该函数被调用时才被初始化。形称形参。形参在该函数被调用时才被初始化。形称形参。形参在该函数被

26、调用时才被初始化。形称形参。形参在该函数被调用时才被初始化。形参的使用将使被调用函数可以从调用函数那里获参的使用将使被调用函数可以从调用函数那里获参的使用将使被调用函数可以从调用函数那里获参的使用将使被调用函数可以从调用函数那里获得数据。如果被调用函数不需要从调用函数那里得数据。如果被调用函数不需要从调用函数那里得数据。如果被调用函数不需要从调用函数那里得数据。如果被调用函数不需要从调用函数那里获得数据,则该函数参数表可以为空。获得数据,则该函数参数表可以为空。获得数据,则该函数参数表可以为空。获得数据,则该函数参数表可以为空。函数的说明函数的说明函数的说明函数的说明(1 1)如果一个函数定义

27、在前,调用在后,则调用)如果一个函数定义在前,调用在后,则调用)如果一个函数定义在前,调用在后,则调用)如果一个函数定义在前,调用在后,则调用前不需要说明前不需要说明前不需要说明前不需要说明(2 2)如果定义在后,调用在后,调用前必须说明)如果定义在后,调用在后,调用前必须说明)如果定义在后,调用在后,调用前必须说明)如果定义在后,调用在后,调用前必须说明说明函数的格式说明函数的格式说明函数的格式说明函数的格式数据类型数据类型数据类型数据类型 函数名(参数表);函数名(参数表);函数名(参数表);函数名(参数表);举例:举例:举例:举例:intint sum sum(intint);););)

28、;2024/9/32024/9/3函数的调用函数的调用格式函数的调用格式函数的调用格式函数的调用格式函数名(实参表);函数名(实参表);函数名(实参表);函数名(实参表);其中,实参表给出调用函数相对应的实参,当有一其中,实参表给出调用函数相对应的实参,当有一其中,实参表给出调用函数相对应的实参,当有一其中,实参表给出调用函数相对应的实参,当有一个以上的参数时需用逗号分隔,每个参数是一个个以上的参数时需用逗号分隔,每个参数是一个个以上的参数时需用逗号分隔,每个参数是一个个以上的参数时需用逗号分隔,每个参数是一个变量或表达式。变量或表达式。变量或表达式。变量或表达式。函数调用过程是将实参传给形参

29、,执行函数体后将函数调用过程是将实参传给形参,执行函数体后将函数调用过程是将实参传给形参,执行函数体后将函数调用过程是将实参传给形参,执行函数体后将结果返回。结果返回。结果返回。结果返回。C+C+C+C+中,实参传给形参的方式有如下中,实参传给形参的方式有如下中,实参传给形参的方式有如下中,实参传给形参的方式有如下几种:几种:几种:几种:(1 1 1 1)传值调用)传值调用)传值调用)传值调用(2 2 2 2)传址调用)传址调用)传址调用)传址调用(3 3 3 3)引用调用)引用调用)引用调用)引用调用2024/9/32024/9/3传值调用传值调用传值调用时,调用函数的实参,使用常量,变量传

30、值调用时,调用函数的实参,使用常量,变量或者表达式值,被调用函数的形参使用变量值。或者表达式值,被调用函数的形参使用变量值。调用时,系统先计算实参表达式的值,再将实参调用时,系统先计算实参表达式的值,再将实参的值按位置对应的赋值给形参,即对形参进行初的值按位置对应的赋值给形参,即对形参进行初始化。因此,传值调用的实现机制是系统将实参始化。因此,传值调用的实现机制是系统将实参备份一个副本给形参。在被调用函数中,形参可备份一个副本给形参。在被调用函数中,形参可以改变,但这只影响副本中的形参值,而不影响以改变,但这只影响副本中的形参值,而不影响调用函数的实参值。所以,传值的调用的特点是调用函数的实参

31、值。所以,传值的调用的特点是形参值的改变不影响实参。形参值的改变不影响实参。2024/9/32024/9/3传值调用示例程序一传值调用示例程序一void swap(int x,int y) int tmp;tmp=x;x=yx=y;y=y=tmptmp; 2024/9/32024/9/3传值调用示例程序二传值调用示例程序二举例 void fun(int* p)p=new int20;2024/9/32024/9/3传址调用传址调用使用传址调用方式时,调用函数的实参使用地址值,被调用函数的形参使用指针,。调用时系统将实参的地址赋值给对应的形参指针,使形参指针指向实参变量。因此,传址调用与前面讲过

32、的传值调用不同,它的实现机制是让形参的指针直接指向实参。所以,传址调用时,在被调用函数中,可以通过改变形参指针所指向的实参变量来间接改变实参值。2024/9/32024/9/3传址调用示例程序一传址调用示例程序一void swap(int *x,int* y)int tmp;tmp=*x;*x=*y*x=*y;* *y=y=tmptmp;2024/9/32024/9/3传址调用示例程序二传址调用示例程序二void fun(int* p)*p=new int20;2024/9/32024/9/3引用调用引用调用使用引用调用时,调用函数的实参要用变量,将实参赋值给形参的引用,相当于使用了实参的别名

33、。于是在被调用函数中,对引用的改变,实质就是直接的通过引用来改变实参的变量值。而且这种调用起到传址调用的作用,但它又比传址调用更方便更直接。2024/9/32024/9/3引用调用示例程序一引用调用示例程序一void swap(int& x,int& y) int tmp;tmp=x;x=yx=y;y=y=tmptmp; 2024/9/32024/9/3函数的参数函数的参数函数参数的求值顺序当一个函数带有多个参数时,C+语言没有规定在函数调用时参数的求值顺序。而编译器根据对代码进行优化的需要自行规定对实参的求值顺序。有的编译器规定自左向右,有的自右向左。一般,求值顺序不会对函数功能有影响。但是

34、,如果实参表达式中带有副作用的运算符时,就有可能产生由于求值顺序不同而造成的二义性。2024/9/32024/9/3函数的参数函数的参数示例程序一int x=4,y=6; int z=add_int(+x,x+y);其中实参是两个表达式+x和x+y。当编译器对实参求值顺序是自左向右时,两个实参值分别为5和11.当编译器对实参求值顺序自右向左时,两个实参值分别为5和10.2024/9/32024/9/3设置函数参数的默认值设置函数参数的默认值intint add_int(intadd_int(int x,intx,int y=10); y=10);在上述对函数在上述对函数add_intadd_i

35、nt()的说明中,对函数的最()的说明中,对函数的最右边的一个参数指定了默认值。在函数调用时,右边的一个参数指定了默认值。在函数调用时,编译器按从左到右的顺序将实参与形参结合起来,编译器按从左到右的顺序将实参与形参结合起来,当实参的数目不足时,编译器将按照同样的顺序当实参的数目不足时,编译器将按照同样的顺序用说明中的或定义中的默认值来补足所缺少的实用说明中的或定义中的默认值来补足所缺少的实参。所以下面的函数调用参。所以下面的函数调用add_int(14);add_int(14);将与下列调用表达式等价将与下列调用表达式等价add_int(14,10);add_int(14,10);2024/9/32024/9/3课后思考课后思考1,打印杨辉三角1 1 1 1211 3 3 1 2,模拟linux命令find name “core*”功能,写一个函数,在指定字符串中查找目标字符串2024/9/32024/9/3Thank You!2024/9/32024/9/32024/9/32024/9/3

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号