版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 C+基础,3.1 数据和表达式 3.2 流程控制语句 3.3 函数 3.4 标识符与名称空间 3.5 数组 3.6 指针 3.7 结构与联合 3.8 引用,3.1 数据和表达式,3.1.1 关键字与标点符号 1.关键字 关键字又称为保留字,是系统预定义的单词。正是这些关键字的存在,才使得程序简单易写,不像机器指令那样晦涩难懂。关键字对编译器有着特殊的意义,不允许对其进行重新定义,也不允许挪作它用。,C+中常用的关键字,auto bool break case catch char class const continue default delete do double else en
2、umextern false float for friend goto if inline int long mutable namespace new operatorprivate protected public register return short signed sizeof static struct switch templatethis throw true try typedef typename union unsigned using virtual void wchar_t while,2.标点符号,P62,表3.2 C+中常用的标点符号 C+中,标点符号具有一定
3、的意义,在程序中用来分隔不同的语法单位或用来界定范围等,以便编译和识别,但其本身并不产生某种操作。,3.1.2 基本类型及其派生类型,下面仅介绍typedef的应用。,用typedef为已有类型定义别名的一般形式如下:typedef 已有类型 已有类型的别名; 例如: typedef int ARRAY10; ARRAY a1, a2; typedef经常用来定义函数指针的别名,例如: typedef int (* funcptr)(int, int);,typedef char * STRING;,typedef对于结构和类等自定义类型同样适用,例如: typedef struct stud
4、ent char name10; int num; char sex; STUDENT, * PSTUDENT; 则可以用STUDENT定义student类型的变量,用PSTUDENT定义student类型的指针。 习惯上,把这种用typedef定义的类型名用大写字母表示,以便与系统提供的类型标识符相区别。,3.1.4 变量的声明与定义,用来存放数据且其值可以改变的量称为变量。一般来说,每个变量都要有类型和名字,变量类型告诉编译器如何为它分配内存,变量名用来访问变量的值。利用C+中的预定义类型、用户自定义类型以及用typedef定义的类型,可以定义所需要的变量。 变量必须遵循先声明后使用的原则
5、,而要使用的话,必须最终有定义。这里就涉及到变量的声明与定义,这是两个不同的问题,也是很容易引起混淆的地方。,3.1.5 变量的初始化与存储属性,(1)自动变量 对于自动变量来说,每当程序运行到其定义所在的程序块时,都会在动态存储区即栈中为它分配内存。 (2)寄存器变量 在定义局部变量时用register修饰,即为寄存器变量。register用来建议编译器,将变量存放在CPU内部的寄存器中,以便提高运行速度。,(3)静态变量,在定义局部变量时用static修饰。对于静态变量来说,其内存分配工作是在主函数开始运行之前进行的,存储在静态存储区而不是栈中。如果在定义的同时赋了初值,就使用该初值,否则
6、初值为0。静态变量在程序运行期间始终占用内存,直到程序结束时才自动释放,因此,它能够保存函数(主函数除外)退出时的值,到下一次调用时继续使用。例如: void f() static int i = 1;/i为静态变量,初值为1 couti+endl;/第1次调用时输出1,第2次调用 时输出2, ,(4)外部变量,在函数体内某个变量的声明之前用extern修饰的时候,意味着该变量是在全局范围即当前范围之外定义的变量,故称为外部变量。该全局变量可能已经定义,也可能到下面才定义,还可能在其他文件中定义,但必须有定义。全局变量也存储在静态存储区,程序运行期间始终占用内存,但其作用域要比静态变量大得多。
7、,3.1.6 常量与符号常量及枚举,常量是指在程序运行过程中其值不能改变的量。C+支持5种类型的常量:浮点型、整型、字符型、布尔型和枚举型。常量在程序中一般以自身的存在形式体现其值。常量具有类型属性,类型决定了各种常量在内存中占据存储空间的大小。,1 const 常量,2. 整型常量 整型数据表示通常意义上的整数,整型常量可以用十进制、八进制或十六进制表示。 1. 十进制常量 一般占一个机器字长,是一个带正负号的常数(默认情况下为正数),如+3,-7等。 2. 八进制常量 由数字0开头,其后由若干07的数字组成,如0378,0123等。 3. 十六进制常量 以0 x或0X开头,其后由若干09的
8、数字及AF(或小写af)的字母组成,如0 x173,0 x3af。,整型常量可以后跟字母l或L表示long型(长整数),也可以跟u或U表示unsigned整数(无符号整数),如以下数是合法的: 375u/无符号整数 12345UL/无符号长整数 54321L/长整数 13579ul/无符号长整数,3. 浮点数常量 浮点数也称为实型数。只能以十进制形式表示。共有两种表示形式:小数表示法和指数表示法。 1. 小数表示法 使用这种表示形式时,实型常量分为整数部分和小数部分。其中的一部分可在实际使用时省略,如10.2,.2,2.等。但整数和小数部分不能同时省略。 2. 指数表示法 也称科学记数法,指数
9、部分以E或e开始,而且必须是整数。如果浮点数采用指数表示法,则E或e的两边都至少要有一位数。如以下数是合法的: 1.2e20,-3.4e-2。,4. 字符常量与字符串常量 1. 字符常量 C+中的字符常量通常是用单引号括起的一个字符。在内存中,字符数据以ASCII码存储,如字符a的ASCII码为97。字符常量包括两类,一类是可显字符,如字母、数字和一些符号 、+等,另一类是不可显字符常量,如ASCII码为13的字符表示回车。 2. 转义字符 转义字符是特殊的字符常量,表示时一般以转义字符开始,后跟不同的字符表示不同的特殊字符,表2列出了常用的特殊字符。,常用的特殊字符,5. 字符串常量,字符串
10、常量是由一对双引号括起来的零个或多个字符序列。 字符串可以写在多行上,不过在这种情况下必须用反斜线表示下一行字符是这一行字符的延续。 字符串常量实际上是一个字符数组,组成数组的字符除显示给出的外,还包括字符结尾处标识字符串结束的符号0,所以字符串“abc”实际上包含4个字符:a、b、c和0。 需要注意的是a和“a”的区别,a是一个字符常量,在内存中占一个字节的存储单元,而“a”是一个字符串常量,在内存中占两个字节,除了存储a以外,还要存储字符串结尾符0。,3.2.4 布尔常量,布尔常量仅有两个:false(假)和true(真)。,枚举常量可以通过建立枚举类型来定义。 枚举类型是一种用户自定义数
11、据类型。在声明枚举类型时,需要把常量的值一一列举出来,形式如下: enum 枚举类型名 常量值1 ,常量值2 ,常量值n; 例如声明一个名为color的枚举类型: enum colorRed,Green,Blue,White,Black; 枚举常量是一种符号常量。Red,Green等是符号常量,它们表示各个枚举值,在内存中表示以整型数。如果没有专门指定,第一个符号常量的枚举值就是0,其他枚举值依次为1,2,3。所以,C+自动给Red赋0,Green赋1,等等。,6. 枚举常量,3.1.7 运算符与表达式,参考教材P72,3.1.8 数据类型转换,1.自动类型转换 2.强制类型转换 int i
12、= 9; float f1 = (float)i / 2; /f1的值为4.5 float f2 = float(i / 2 ); /f2的值为4.0,int i = 3, j = 2; float f = 1.5f; double d = f + i / j;,3.2 流程控制语句,3.2.1 选择语句 if语句 switch语句 3.2.2 循环语句 1.while语句 2.do while语句 3.for语句,3.2.3 转向语句,1.goto语句 goto语句又称为无条件转向语句 2.continue语句 3.break语句 break语句又称为跳出语句 4.return语句,3.3
13、函 数,例3.5 函数的声明与定义。 #include void display(char c); /函数声明 void main() display(A); /函数调用 void display(char c) /函数定义 coutvalue of character c is: (int)cendl; ,3.3.2 函数的形式参数与实际参数,例3.6 求3个数中的最大者。 #include int max(int x, int y, int z) /函数定义,x、y和z为形参 if(y x) x = y; if(z x) x = z; return x; void main() int a
14、, b, c; coutabc; coutMaximum = max(a, b, c)endl; /函数调用,a、b和c为实参 ,3.3.3 函数的调用与数据传递形式,值传递、地址传递和引用传递。关于引用传递,后面再详细介绍,这里只介绍值传递和地址传递。,(1)传值调用,例3.7 传值调用。 #include void swap(int x, int y) /形参为普通类型的变量 coutxtyendl; int temp = x; x = y; y = temp; coutxtyendl; void main() int x = 3, y = 5; swap(x, y); /实参为变量 co
15、utxtyendl; 运行结果如下: 3 5 5 3 3 5,(2)传地址调用,例3.8 传地址调用。 #include void swap(int * x, int * y) /形参为指针类型的变量 int temp = *x; *x = *y; *y = temp; void main() int x = 3, y = 5; swap( 运行结果如下: 5 3,3.返回值传递形式,函数的返回值通过值传递、地址传递和引用传递时,分别称为返回拷贝、返回地址或返回引用,这里只介绍返回拷贝和返回地址。 (1)返回拷贝 这是C+默认的返回值传递形式。所谓返回拷贝指的是,在定义函数时将函数的返回值声明
16、为普通类型,并用return语句返回常量、变量或表达式。执行return语句时,系统会在内存中生成一个临时变量,并将常量、变量或表达式的值拷贝到该临时变量中。该临时变量的生存期到函数调用所在语句执行完毕结束,可以在函数返回后被主调函数临时使用。 (2)返回地址 所谓返回地址指的是,在定义函数时将函数的返回值声明为指针类型,并用return语句返回地址。如果希望在函数返回后继续使用其返回值作为变量的地址,从而对该地址中的内容进行各种操作,则被取地址的变量必须要有较长的生存期,即在函数调用所在语句执行完毕,该变量在内存中仍然存在。,3.3.4 函数形参的缺省值,例3.9 形参带缺省值的函数。 #i
17、nclude void show(int = 1, double = 2.3, char = A); /声明函数时为其形参指定缺省值 void main() show(); /3个形参的初值皆采用缺省值 show(5); /第2、3个形参的初值皆采用缺省值 show(6, 7.8); /第3个形参的初值采用缺省值 show(2, 3.5, B); /3个形参的初值皆采用实参给定的值 void show(int i, double d, char c) couti, d, cendl; ,3.3.5 函数重载,C+中,在同一个作用域内,只要函数的形参有所不同,即形参的类型、个数或顺序有所不同,两
18、个或多个函数可以使用同样的名字。这种情况称为函数重载,各同名函数称为重载函数。仅仅返回类型不同是不行的。 对于重载函数,编译器会根据调用函数时的实参类型,自动确定到底应该调用哪一个。因此,函数重载常用于定义功能类似但处理不同类型之数据的多个函数。,例3.10 求不同类型数据之平方的函数。 #include int square(int i) /求int类型数据的平方 return i * i; double square(double f) /求double类型数据的平方 return f * f; void main() coutsquare(100)endl; /实参为int类型 cout
19、square(1.5)endl; /实参为double类型 ,3.3.6 内联函数,在C+里,可以在函数的声明或定义之前冠以关键字inline,将函数声明为内联函数。对于内联函数来说,编译器在调用处嵌入经过适当处理的代码,完成函数的功能,然而并不发生真正的函数调用,也就省去了函数调用的开销。 但是,如果一个内联函数被多处调用,可执行文件的长度就会增加很多,反而可能降低执行效率。因此,一般仅将那些代码比较短且循环调用的函数声明为内联函数。,例3.11 内联函数的应用。 #include inline void display(int i) /将display()函数声明为内联函数 coutiti
20、 * iti * i * iendl; /输出i、i2、和i3 void main() for(int i = 0; i 100; i+) display(i); /循环调用display()函数 ,3.3.7 递归函数,在函数体内直接或间接调用函数本身。通过递归,可以将复杂的问题逐步转化为越来越简单的问题,最后转化为不需要再向下递归的最小问题。有了最小问题的解之后,再逐步返回,依次得到较大问题的解,最终得到原有问题的解。 使用递归函数的优点是,能够让程序语言的描述与问题的自然描述相一致。但是,函数每递归一次,都需要保存一次现场,函数形参和局部变量也都需要重新分配一次内存,每次返回时也都需要恢
21、复现场,并撤销函数形参和局部变量所占用的内存,开销必然很大。而且,可以利用循环来解决几乎所有递归问题。故一般不再使用递归函数。,3.4 标识符与名称空间,1.名称空间的定义 C+中,可以利用关键字namespace来定义名称空间,将全局作用域进一步划分为不同的作用域。定义名称空间的一般形式如下: namespace 名称空间名 语句序列; ,(1)指定标识符所属的名称空间 一般形式如下: 名称空间名:标识符 这种方法的好处是,能够保证其唯一性。但是,也有缺点,那就是每次使用时都需要指定标识符所属的名称空间。如果名称空间名比较长,就很不方便。为此,C+允许为名称空间取别名,若别名比较短,就比较方
22、便。为名称空间取别名的一般形式如下: namespace 名称空间别名 = 名称空间原名; (2)指定使用名称空间中的特定标识符 一般形式如下: using 名称空间名:名称空间中的标识符; 在某个作用域内出现如上语句时,则从该处开始,直到该作用域结束,都可以直接使用所指定的标识符,不必再指定它所属的名称空间。所指定的标识符就像全局标识符那样。 (3)指定使用名称空间中的全部标识符 一般形式如下: using namespace 名称空间名;,例3.14 名称空间的定义与使用。 #include namespace A int a = 10; /在名称空间A内定义变量 namespace B
23、int f(int x); /在名称空间B内声明函数 int B:f(int x) /在名称空间外定义名称空间B内声明的函数 return x + A:a; /使用名称空间A中的变量a namespace A /为名称空间A追加定义 int f(int x) /在名称空间A内定义函数 return x * a; /使用本名称空间中的变量a void main() using A:f; /使用名称空间A中的函数f() coutf(10)endl; /调用名称空间A中的函数f() coutB:f(10)endl; /调用名称空间B中的函数f() 运行结果为: 100 20,3.5 数 组,程序运行
24、之前数组的大小必须已知。 int a5, b34, c234; 二维数组可以看作是由多个一维数组组成的,例如上面的二维数组,可以看作3个一维数组,这3个一维数组的数组名分别为b0、b1和b2,每个一维数组又包含4个元素。多维数组也是如此,例如上面的三维数组,可以看作2个二维数组,每个二维数组又可以看作3个一维数组,每个一维数组又包含4个元素。,数组的存储与访问,int b23; 其元素在内存中的排列顺序依次为b00、b01、b02、b10、b11和b12。,例3.15 传递数组元素。 #include int index10 = 9, 8, 7, 6, 5, 4, 3, 2, 1, 0; in
25、t data10 = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9; int f(int index) return dataindex; /返回数组元素 void main() for(int i = 0; i 10; i+) coutf(indexi) ; /数组元素作为实参 coutendl; ,例3.16 通过传递数组名和数组元素的地址,输出字符串中指定字母之后的子串,指定字母包括在内。 #include char * find(char str, char c) int i = 0; while(stri != 0) if(stri = c) return /数组名作为实
26、参 ,指针的概念,2 指针的定义和使用,指针是一个变量,在程序中使用时,先声明,后使用。在指针声明的同时也可以进行初始化。 指针的定义: 存储类型 数据类型 *指针变量名,例如: int *p1; static int *p2; char *da;,指针变量的赋值:,1、用变量的地址给指针变量赋初值; 2、用相同类型的指针变量赋初值; 3、赋空值NULL 指针变量的初始化方法: 赋空值NULL或0; 用已定义变量的地址;,如: int a, b ,*p; p=,指针变量的应用: 应用:通过指针变量访问所指变量 (1)将指针变量指向被访问的变量 (2)访问所指变量 取内容: b=*p; 存内容:
27、*p=100; 若*P出现在“=”的右边或其他表达式中则为取内容; 若*P出现在“=”的左边则为存内容,如: int a ,*p; p=,写出下面各表达式的结果,并找出具有等价关系的是式子: int a=5,*p= int *p1= 注意:上述语句中的两个指针p1,p2指向的类型不同,因此,除非进行强制类型转换,否则它们之间不能相互赋值。但是void指针是一个特例。,空类型(void)指针: 不指定指针指向一个固定的类型,仅仅是用来存放一个地址。 定义格式为: void *p; 比如: int a; int *p1= 注意:void指针它可以指向任何类型的C+数据。不过,如果需要将void指针
28、的值赋给其他类型的指针,则需要进行强制类型转换。,2 const指针 关键字const放在不同的位置表示的意义也不相同: (1)关键字const放在指针类型前,就是声明一个指向常量的指针。此时,在程序中不能通过指针来改变它所指向的值,但是指针本身的值可以改变,即指针可以指向其他数据。 (2)关键字const放在“*”号和指针名之间,就是声明一个指针常量(也称常指针)。因此,指针本身的值不可改变,也即它不能再指向其他数据,但它所指向的数据的值可以改变。 (3)关键字const在上述两个地方都加,则是声明一个指向常量的指针常量,指针本身的值不可改变,它所指向的数据的值也不能通过指针改变。,4 指针
29、与数组,要访问或使用一个数组元素,可以用三种不同的方法。一种是下标法,另一种是地址法,还有一种是指针法。 1. 下标法 这种方法在前面已学习过,即指出数组名和下标值,系统就会找到该元素。数组用其下标变化实行对内存中的数组元素进行处理。,例如,程序中说明了一个数组: int a5; 则编译系统在一定的内存区域为该数组分配了存放int型数据的5个连续存储空间,它们分别是a0,a1,a5。则ai表示从数组存储首地址开始的第i个元素变量。在程序中通过i的变化就可以处理数组中的任何元素。ai就是用下标法表示的数组元素。,2. 地址法 前面已经介绍,一个数组名代表它的起始地址。地址法即通过地址访问某一数组
30、元素。 例如,程序中说明了一个数组: int a5; 则a的值就是数组的起始地址,即a指向a0,a+1指向a1,。同样,a+i是ai的地址,通过a+i的地址可以找到ai元素,即*(a+i)就是ai。,例如:要访问数组元素a3,下面两种方式是等价的: a3 下标法 *(a+3)地址法 从另一个角度来看,a+i和 并且通过指针赋值运算; pa=a; 或 pa= 则指针pa就指向了数组a的首地址。这里指针的目标变量*pa就是a0。根据上节介绍的指针运算的原理,*(pa+1)就是a1,*(pa+2)就是a2。即*(pa+i)就是ai 。,对于二维数组,又是如何用指针访问其中的每个数组元素的呢? 例如,
31、定义了一个二维数组a: int a35; a是以一个3*5的二维数组,它有三行,每一行都有其起始地址。 C+语言规定以a0,a1,a2分别表示第0行,第1行,第2行的起始地址,即该行第0列元素的地址。注意a0,a1,a2并不是一个元素,而是一行首地址,正如同一维数组名是数组起始地址一样,a0的值等于 则对它的访问方法有: *(*(a+i)+j) *(ai+j) *(a+i)j *(a+3*i+j),如果用指针法访问二维数组中的元素,处理的方法也有许多种。 假设定义了一个指向上述二维数组a首元素的指针p,以下列出一部分通过这个指针访问数组元素aij的方法: *(*(p+i)+j) *(pi+j)
32、 *(p+i)j *(p+3*i+j) pij,对于三维以上的多维数组,访问数组元素的方法在原理上是一样的,只是在使用时一定要注意C+中多维数组中各元素在内存单元中的存储顺序。并且,在利用指针访问数组元素时,同样要注意越界问题。,2 数组指针与指针数组 数组指针就是一个指向数组的指针;指针数组就是其元素为指针的数组。 数组指针 数组指针是一个指向一维数组的指针变量,定义数组指针的格式为: 数据类型 (*指针名)常量表达式;,例如: int (*p)5; 上面这个语句定义了一个数组指针p,它指向一个包含5个元素的一维数组,数组元素为整型。注意,*p两侧的圆括号不能省略,它表示p先与星号“*”结合
33、,是指针变量。如果省略了圆括号,即写成*p5的形式,由于方括号的优先级比星号高,则p先与方括号 结合,是数组类型,那么语句int *p5;是定义了一个指针数组。,2. 指针数组 指针数组就是其元素为指针的数组。它是指针的集合,它的每一个元素都是指针变量,并且它们具有相同的存储类型和指向相同的数据类型。 说明指针数组的语法格式为: 数据类型 *指针数组名常量表达式; 其中,数据类型式指数组中各元素指针所指向的类型,同一指针数组中各指针元素指向的类型相同;指针数组名也即数组的首地址,是一个标识符;常量表达式指出这个数组中的元素个数。 例如:下面定义了几个指针数组。 int *p16; float
34、*p234;,具有相同类型的指针数组可以在一起说明,它们也可以与变量,指针等一起说明。如: int a, *p2; 指针数组在使用前也必须首先赋值,也可以利用初始化赋值。 指针数组主要用于字符串的操作,例如: static char*name5=“Tom”, ”John”, ”Mary”,”SmithBlack”,”Rose”; 其中name是一维数组,每一个元素都是指向字符数据的指针类型数据,其中name0指向第一个字符串“Tom”,name1指向第二个字符串“John”,。 用指针数组处理字符串不仅可以节省内存,而且提高运算效率。例如,想对5个姓名排序,若将字符串交换位置速度慢,而交换地址
35、则速度快得多。,5 动态内存分配,所谓动态内存分配是指在程序运行期间根据实际需要随时申请内存,并在不需要时释放。 应用程序数据所占得内存可以分为3类:静态存储区、栈、堆。在程序运行开始前就分配的存储空间都在静态存储区中;局部变量分配的存储空间在栈中;动态内存分配的存储空间在堆中,堆也称为自由存储单元。new运算符与delete运算符一起使用,就可以直接进行动态内存的申请和释放(也称为创建和删除)。,1 new运算符 new运算符用于申请所需的内存单元,返回指定类型的一个指针。它的语法格式为: 指针=new 数据类型; 其中,指针应预先声明,指针指向的数据类型与new后的数据类型相同。若申请成功
36、,则返回分配单元的首地址给指针;否则(比如没有足够的内存空间),则返回0(一个空指针)。例如: int *p; p=new int; 系统自动根据int类型的空间大小开辟一个内存单元,用来保存int型数据,并将地址保存在指针p中。,对于动态内存分配,应在分配操作结束以后,首先检查返回的地址值是否为0,以确认内存申请是否成功。在分配成功以后,就可以使用这个指针。例如: *p=1; 即把int型数值1赋给指针p所指向的int型内存单元。 在申请分配内存单元时,也可以指定分配的内存大小。例如: int *p; p=new int(30); 则系统为指针p分配了30个字节的内存单元存放int型数据。,
37、也可以用new运算符申请一块保存数组的内存单元,即创建一个数组。创建一维数组的语法格式为: 指针=new 数据类型常量表达式; 其中,常量表达式给出数组元素的个数,指针指向分配的内存首地址,指针的类型与new后的数据类型相同。 例如: int *p; p=new int10; 则系统为指针p分配了整型数组的内存,数组中有10个元素。,对于动态创建多维数组,情况要复杂一些。以二维数组为例,语法格式为: 指针=new 数据类型常量表达式1常量表达式2; 若申请成功,指针指向分配的内存首地址,但此时指针的类型不是new后的数据类型,而是一个该类型的数组,即指针是一个数组指针。 例如: int (*p
38、)3; p=new int23; 则系统为指针p分配了一个二维数组。,2 delete运算符 delete运算符是释放new申请到的内存。也即,当程序中不再需要使用运算符new创建的某个内存单元时,就必须用运算符delete来删除它。它的语法格式为: delete 指针; /释放非数组内存单元 delete常量 指针; /释放数组内存单元 其中,指针是指向需要释放的内存单元的指针的名字。并且delete只是删除动态内存单元,并不会将指针本身删除。,对于释放对象的不同,delete的语法格式也不同。对于数组内存单元的释放,一定要带“常量”部分,常量告诉delete数组有多少个元素。如果没有带“常
39、量”部分,则只释放数组的第一个元素占据的内存单元。 例如:对int型内存单元的申请和释放。 int *p; p=new int; /申请内存单元 *p=1; delete p; /释放内存单元 例如:对数组内存单元的申请和释放。 int *p; p=new int10; delete10 p;,需要注意的是: (1)在程序中对应于每次使用运算符new,都应该相应地使用运算符delete来释放申请的内存。并且对应于每个运算符new,只能调用一次delete来释放内存,否则有可能导致系统崩溃。 (2)运算符delete必须用于先前new分配的有效指针,而不能用于未定义的其他任何类型的指针。 (3)
40、对空指针调用delete是安全的。 (4)C+语言保留了C语言中的两个库函数:malloc()与free()。这两个函数也是实现动态内存分配作用的,其功能分别与运算符new和delete相似。,危险,6 指针与字符串,在C+语言中,可以定义一个字符数组,将字符串存放在该数组中,通过数组下标来访问所需的字符;也可以定义一个字符指针,通过指针的指向来访问所需的字符。 1 通过指针访问字符 如果要通过指针访问一个字符串,可以将这个指针指向此字符串,并利用指针的加1、减1操作实现对各个字符的访问。,例:利用字符指针访问字符串。 程序一: #include void main() char *str=h
41、ello; coutstrendl; ,字符串常量,字符数组名和字符指针是同一类,void main() char buffer10=ABC ; char* pc; pc=hello; /将字符串常量的首地址赋给指针 cout pc endl; pc+; cout pc endl; cout *pc endl; pc=buffer; cout pc; ,2 几个常用的字符串处理函数 C+提供了许多字符串处理的库函数。常用的有: 1. strcat() char *strcat(char *s1,char *s2) 字符串连接函数,将字符串s2连接到字符串s1的后面,并返回s1的地址值。 2.
42、strcmp() int strcmp(const char *s1,const char *s2,int n) 字符串比较函数,比较两个字符串s1和s2的大小(如果有参数n,比较前n个字符的大小)。当字符串s1大于、等于或小于字符串s2时,函数返回值分别是正数、零和负数。,3. strcpy() char *strcpy(char *s1,const char *s2) 将s2所指向的字符串复制到s1所指向的字符数组中,然后返回s1的地址值。 4. strlen() int strlen(const char *s) 返回字符串s的长度。 当程序中使用这些字符串处理函数时,需要在程序的开始加
43、上头文件string.h。,7 指针与函数,在介绍了在调用函数的实参与形参之间具有三种传递方式:传值方式、地址传递和引用传递。利用指针作函数参数,可以方便地实现地址传递。函数可以返回指针,指针也可以指向函数。,1 指针作为函数参数 如果函数的某个参数是指针,对这个函数的调用就是传址调用,也就是使实参指针和形参指针变量指向同一内存地址。在被调用函数的运行过程中,对形参指针所指向的地址中内容的改变都会影响到实参。 虽然用指针作函数的参数可以使得形参的改变对相应的实参有效。但是,如果在函数中反复使用指针进行间接访问,会影响程序的可读性且容易产生错误,因此在C+语言中扩充了引用的概念,这样既可以实现指针所带来的功能,又使程序清晰易读。关于引用的概念将在本书的第八章介绍。,当以数据的地址作为实参调用一个函数时,被调用函数的形参也必须是可接收地址的变量,并且数据类型必须与被传送的数据类型相同。 由于数组名是一个指针,因此,数组名也可以用作函数的参数,也属于传址调用。 注意:在函数的传址调用中,传递的参数的值并不改变,也即指针本身的值并不改变,改变的是它指向的值。,2 指针型函数 除了void类型的函数之外,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东临沂市临沭县2025-2026学年度下学期期末学业水平测试三年级语文(文字版含答案)
- 2026年中医综合医院医院招聘考试笔试试题(含答案)
- 2026年烟草生产车间安全监管烟草公司招聘考试笔试试题(含答案)
- 2026 年眼科复杂白内障术后感染护理个案分享
- 2026 年大面积肺栓塞溶栓治疗监护护理个案
- 2026年秋季初中道德与法治开学第一课 学科之美发现教案
- 2026年秋季大学开学第一课 时间管理与高效学习教学设计
- 污泥处理电气专项施工方案
- 2026年血管活性药物静脉输注护理考核试题(+答案)
- 室内改造装修施工方案
- 2026福建福州古厝运营服务有限公司招聘5人考试模拟试题及答案详解
- 湖北省黄冈市2026-2027学年八上数学期末教学质量检测模拟试题含解析
- GB/T 5782-2025紧固件六角头螺栓
- 医保基金检查合同范本
- DB51 T1996-2015四川公路工程超声回弹综合法 检测结构混凝土强度技术规程
- 《宠物美容与护理》课件-梳毛工具
- 护理查房特发性突聋
- GB/T 44370-2024系统和软件工程软件产品质量要求和评估可用性通用行业格式用户需求说明
- 《建筑排水塑料管道工程技术规程 CJJT29-2010》
- 食品安全与日常饮食智慧树知到期末考试答案章节答案2024年中国农业大学
- 海南省民族教育发展提升行动计划(2023-2025年)
评论
0/150
提交评论