C++第3章 c++基础.ppt

上传人:s****8 文档编号:68701590 上传时间:2022-12-29 格式:PPT 页数:108 大小:1.40MB
返回 下载 相关 举报
C++第3章 c++基础.ppt_第1页
第1页 / 共108页
C++第3章 c++基础.ppt_第2页
第2页 / 共108页
点击查看更多>>
资源描述

《C++第3章 c++基础.ppt》由会员分享,可在线阅读,更多相关《C++第3章 c++基础.ppt(108页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第第3 3章章 C+C+基础基础 3.1 3.1 数据和表达式数据和表达式 3.2 3.2 流程控制语句流程控制语句 3.3 3.3 函数函数 3.4 3.4 标识符与名称空间标识符与名称空间 3.5 3.5 数组数组 3.6 3.6 指针指针 3.7 3.7 结构与联合结构与联合 3.8 3.8 引用引用 3.1 3.1 数据和表达式数据和表达式3.1.1 3.1.1 关键字与标点符号关键字与标点符号1.1.关键字关键字 关键字又称为保留字,是系统预定义的关键字又称为保留字,是系统预定义的单词。正是这些关键字的存在,才使得程序单词。正是这些关键字的存在,才使得程序简单易写,不像机器指令那样晦

2、涩难懂。关简单易写,不像机器指令那样晦涩难懂。关键字对编译器有着特殊的意义,不允许对其键字对编译器有着特殊的意义,不允许对其进行重新定义,也不允许挪作它用进行重新定义,也不允许挪作它用。C+中常用的关键字中常用的关键字 auto bool break case catch char class const continue default delete do double else enumextern false float for friend goto if inline int long mutable namespace new operatorprivate protected p

3、ublic register return short signed sizeof static struct switch templatethis throw true try typedef typename union unsigned using virtual void wchar_t while2.标点符号标点符号P62,P62,表表3.2 C+3.2 C+中常用的标点符号中常用的标点符号 C+C+中,标点符号具有一定的意义,在程中,标点符号具有一定的意义,在程序中用来分隔不同的语法单位或用来界定序中用来分隔不同的语法单位或用来界定范围等,以便编译和识别,但其本身并不范围等,以便

4、编译和识别,但其本身并不产生某种操作。产生某种操作。3.1.2 基本类型及其派生类型基本类型及其派生类型数据类型基本类型空类型(无值类型)void构造类型类类型class指针类型整型int实型(浮点型)字符型逻辑型bool结构类型struct数组类型枚举型类型enum联合型类型union单精度型float双精度型double单字符型char宽字符型wchar_t图1 C+数据类型下面仅介绍typedef的应用。用用typedeftypedef为已有类型定义别名的一般形式如为已有类型定义别名的一般形式如下:下:typedeftypedef 已有类型已有类型 已有类型的别名已有类型的别名;例如:例

5、如:typedeftypedef intint ARRAY10;ARRAY10;ARRAY a1,a2;typedef经常用来定义函数指针的别名,例经常用来定义函数指针的别名,例如:如:typedef int(*funcptr)(int,int);typedeftypedef char*STRING;char*STRING;typedeftypedef对于结构和类等自定义类型同样适用,对于结构和类等自定义类型同样适用,例如:例如:typedeftypedef structstruct student student char name10;char name10;intint num;num;

6、char sex;char sex;STUDENT,*PSTUDENT;STUDENT,*PSTUDENT;则可以用则可以用STUDENTSTUDENT定义定义studentstudent类型的变量,用类型的变量,用PSTUDENTPSTUDENT定义定义studentstudent类型的指针。类型的指针。习惯上,把这种用习惯上,把这种用typedeftypedef定义的类型名用定义的类型名用大写字母表示,以便与系统提供的类型标识符相大写字母表示,以便与系统提供的类型标识符相区别。区别。3.1.4 变量的声明与定义变量的声明与定义用来存放数据且其值可以改变的量称为变量。一用来存放数据且其值可以

7、改变的量称为变量。一般来说,每个变量都要有类型和名字,变量类型般来说,每个变量都要有类型和名字,变量类型告诉编译器如何为它分配内存,变量名用来访问告诉编译器如何为它分配内存,变量名用来访问变量的值。利用变量的值。利用C+C+中的预定义类型、用户自定中的预定义类型、用户自定义类型以及用义类型以及用typedeftypedef定义的类型,可以定义所定义的类型,可以定义所需要的变量。需要的变量。变量必须遵循先声明后使用的原则,而要使变量必须遵循先声明后使用的原则,而要使用的话,必须最终有定义。这里就涉及到变量的用的话,必须最终有定义。这里就涉及到变量的声明与定义,这是两个不同的问题,也是很容易声明与

8、定义,这是两个不同的问题,也是很容易引起混淆的地方。引起混淆的地方。3.1.5 变量的初始化与存储属性(1)自动变量 对于自动变量来说,每当程序运行到其定义所在的程序块时,都会在动态存储区即栈中为它分配内存。(2)寄存器变量寄存器变量 在定义局部变量时用register修饰,即为寄存器变量。register用来建议编译器,将变量存放在CPU内部的寄存器中,以便提高运行速度。(3)静态变量静态变量在定义局部变量时用在定义局部变量时用staticstatic修饰。对于静态变量来说,其修饰。对于静态变量来说,其内存分配工作是在主函数开始运行之前进行的,存储在内存分配工作是在主函数开始运行之前进行的,

9、存储在静静态存储区态存储区而不是栈中。如果在定义的同时赋了初值,就使而不是栈中。如果在定义的同时赋了初值,就使用该初值,否则初值为用该初值,否则初值为0 0。静态变量在程序运行期间始终。静态变量在程序运行期间始终占用内存,直到程序结束时才自动释放,因此,它能够保占用内存,直到程序结束时才自动释放,因此,它能够保存函数存函数(主函数除外主函数除外)退出时的值,到下一次调用时继续使退出时的值,到下一次调用时继续使用。例如:用。例如:void f()void f()static static intint i=1;/i i=1;/i为静态变量,初值为为静态变量,初值为1 1 coutcouti+i+

10、endlendl;/;/第第1 1次调用时输出次调用时输出1 1,第,第2 2次调用次调用 时输出时输出2 2,(4 4)外部变量)外部变量在函数体内某个变量的声明之前用在函数体内某个变量的声明之前用externextern修饰的时候,意味着该变量是在全局范围修饰的时候,意味着该变量是在全局范围即当前范围之外定义的变量,故称为外部即当前范围之外定义的变量,故称为外部变量。该变量。该全局变量全局变量可能已经定义,也可能可能已经定义,也可能到下面才定义,还可能在其他文件中定义,到下面才定义,还可能在其他文件中定义,但必须有定义。全局变量也存储在但必须有定义。全局变量也存储在静态存静态存储区储区,程

11、序运行期间始终占用内存,但其,程序运行期间始终占用内存,但其作用域要比静态变量大得多。作用域要比静态变量大得多。3.1.6 3.1.6 常量与符号常量及枚举常量与符号常量及枚举 常量是指在程序运行过程中其值不能常量是指在程序运行过程中其值不能改变的量。改变的量。C+C+支持支持5 5种类型的常量:浮点种类型的常量:浮点型、整型、字符型、布尔型和枚举型。常型、整型、字符型、布尔型和枚举型。常量在程序中一般以自身的存在形式体现其量在程序中一般以自身的存在形式体现其值。常量具有类型属性,类型决定了各种值。常量具有类型属性,类型决定了各种常量在内存中占据存储空间的大小。常量在内存中占据存储空间的大小。

12、1 const 常量2.整型常量整型常量整整型型数数据据表表示示通通常常意意义义上上的的整整数数,整整型型常常量量可可以以用用十十进进制制、八进制或十六进制表示。八进制或十六进制表示。1.1.十进制常量十进制常量一一般般占占一一个个机机器器字字长长,是是一一个个带带正正负负号号的的常常数数(默默认认情情况况下为正数),如下为正数),如+3+3,-7-7等。等。2.2.八进制常量八进制常量由由数数字字0 0开开头头,其其后后由由若若干干0707的的数数字字组组成成,如如03780378,01230123等。等。3.3.十六进制常量十六进制常量以以0 x0 x或或0X0X开头,其后由若干开头,其后

13、由若干0909的数字及的数字及AFAF(或小写或小写afaf)的字母组成,如的字母组成,如0 x1730 x173,0 x3af0 x3af。整整型型常常量量可可以以后后跟跟字字母母l l或或L L表表示示longlong型型(长长整整数数),也也可可以以跟跟u u或或U U表表示示unsignedunsigned整整数数(无无符符号号整整数数),如如以以下下数数是是合合法法的:的:375u375u/无符号整数无符号整数12345UL12345UL/无符号长整数无符号长整数54321L54321L/长整数长整数 13579ul13579ul/无符号长整数无符号长整数3.浮点数常量浮点数常量浮浮

14、点点数数也也称称为为实实型型数数。只只能能以以十十进进制制形形式式表表示示。共有两种表示形式:小数表示法和指数表示法。共有两种表示形式:小数表示法和指数表示法。1.1.小数表示法小数表示法使使用用这这种种表表示示形形式式时时,实实型型常常量量分分为为整整数数部部分分和和小小数数部部分分。其其中中的的一一部部分分可可在在实实际际使使用用时时省省略略,如如10.210.2,.2.2,2.2.等。但整数和小数部分不能同时省略。等。但整数和小数部分不能同时省略。2.2.指数表示法指数表示法也也称称科科学学记记数数法法,指指数数部部分分以以E E或或e e开开始始,而而且且必必须须是是整整数数。如如果果

15、浮浮点点数数采采用用指指数数表表示示法法,则则E E或或e e的的两边都至少要有一位数。如以下数是合法的:两边都至少要有一位数。如以下数是合法的:1.2e201.2e20,-3.4e-2-3.4e-2。4.字符常量与字符串常量字符常量与字符串常量1.字符常量字符常量C+中中的的字字符符常常量量通通常常是是用用单单引引号号括括起起的的一一个个字字符符。在在内内存存中中,字字符符数数据据以以ASCII码码存存储储,如如字字符符a的的ASCII码码为为97。字字符符常常量量包包括括两两类类,一一类类是是可可显显字字符符,如如字字母母、数数字字和和一一些些符符号号、+等等,另另一一类类是是不不可可显显

16、字字符符常常量量,如如ASCII码码为为13的字符表示回车。的字符表示回车。2.转义字符转义字符转义字符是特殊的字符常量,表示时一般以转义转义字符是特殊的字符常量,表示时一般以转义字符字符开始,后跟不同的字符表示不同的特殊字开始,后跟不同的字符表示不同的特殊字符,符,表表2列出了常用的特殊字符。列出了常用的特殊字符。名称符号空字符(null)0换行(newline)n换页(formfeed)f回车(carriage return)r退格(backspace)b响铃(bell)a水平制表(horizontal tab)t垂直制表(vertical tab)v反斜线(backslash)问号(qu

17、estion mark)?单引号(single quote)双引号(double quote)”常用的特殊字符 5.5.字符串常量字符串常量字符串常量是由一对双引号括起来的零个或多个字符序列。字符串常量是由一对双引号括起来的零个或多个字符序列。字字符符串串可可以以写写在在多多行行上上,不不过过在在这这种种情情况况下下必必须须用用反反斜斜线线表示下一行字符是这一行字符的延续。表示下一行字符是这一行字符的延续。字符串常量实际上是一个字符数组,组成数组的字符除显字符串常量实际上是一个字符数组,组成数组的字符除显示给出的外,还包括字符结尾处标识字符串结束的符号示给出的外,还包括字符结尾处标识字符串结束

18、的符号00,所以字符串,所以字符串“abcabc”实际上包含实际上包含4 4个字符:个字符:aa、bb、cc和和00。需要注意的是需要注意的是aa和和“a”a”的区别,的区别,aa是一个字符常是一个字符常量,在内存中占一个字节的存储单元,而量,在内存中占一个字节的存储单元,而“a”a”是一个字符串是一个字符串常量,在内存中占两个字节,除了存储常量,在内存中占两个字节,除了存储aa以外,还要存储以外,还要存储字符串结尾符字符串结尾符00。3.2.4 布尔常量布尔常量布尔常量仅有两个:false(假)和true(真)。枚举常量可以通过建立枚举类型来定义。枚举常量可以通过建立枚举类型来定义。枚枚举举

19、类类型型是是一一种种用用户户自自定定义义数数据据类类型型。在在声声明明枚枚举举类类型型时时,需要把常量的值一一列举出来,形式如下:需要把常量的值一一列举出来,形式如下:enumenum 枚举类型名枚举类型名 常量值常量值1 1,常量值,常量值2 2,常量值,常量值nn;例如声明一个名为例如声明一个名为colorcolor的枚举类型:的枚举类型:enumenum colorRed,Green,Blue,White,Black;colorRed,Green,Blue,White,Black;枚举常量是一种符号常量。枚举常量是一种符号常量。RedRed,GreenGreen等是符号常量,它等是符号常

20、量,它们表示各个枚举值,在内存中表示以整型数。如果没有专门指们表示各个枚举值,在内存中表示以整型数。如果没有专门指定,第一个符号常量的枚举值就是定,第一个符号常量的枚举值就是0 0,其他枚举值依次为,其他枚举值依次为1 1,2 2,33。所以,。所以,C+C+自动给自动给RedRed赋赋0 0,GreenGreen赋赋1 1,等等。,等等。6.枚举常量枚举常量3.1.7 3.1.7 运算符与表达式运算符与表达式参考教材P723.1.8 3.1.8 数据类型转换数据类型转换1.自动类型转换自动类型转换 2.强制类型转换强制类型转换 int i=9;float f1=(float)i/2;/f1的

21、值为4.5float f2=float(i/2);/f2的值为4.0intint i=3,j=2;i=3,j=2;float f=1.5f;float f=1.5f;double d=f+i/j;double d=f+i/j;3.2 3.2 流程控制语句流程控制语句3.2.1 选择语句选择语句if语句语句 switch语句语句 3.2.2 循环语句循环语句 1.while语句语句 2.do while语句语句 3.for语句语句 3.2.3 3.2.3 转向语句转向语句1.goto语句语句 goto语句又称为无条件转向语句 2.continue语句语句 3.break语句语句 break语句又

22、称为跳出语句 4.return语句语句 3.3 3.3 函函 数数例例3.5 3.5 函数的声明与定义。函数的声明与定义。#include#include void void display(chardisplay(char c);c);/函数声明函数声明 void main()void main()display(Adisplay(A););/函数调用函数调用 void void display(chardisplay(char c)c)/函数定义函数定义 coutcoutvalue of character c is:value of character c is:(int)cint)ce

23、ndlendl;3.3.2 3.3.2 函数的形式参数与实际参数函数的形式参数与实际参数例例3.6 3.6 求求3 3个数中的最大者。个数中的最大者。#include#include intint max(intmax(int x,x,intint y,y,intint z)/z)/函数定义,函数定义,x x、y y和和z z为形参为形参 if(yif(y x)x)x=y;x=y;if(zif(z x)x)x=z;x=z;return x;return x;void main()void main()intint a,b,c;a,b,c;coutcoutplease input three i

24、ntegers:;abc;abc;coutcoutMaximum=Maximum=max(amax(a,b,c),b,c)endlendl;/;/函数调用,函数调用,a a、b b和和c c为实参为实参 3.3.3 3.3.3 函数的调用与数据传递形式函数的调用与数据传递形式值传递、地址传递和引用传递。关于引用值传递、地址传递和引用传递。关于引用传递,后面再详细介绍,这里只介绍值传传递,后面再详细介绍,这里只介绍值传递和地址传递。递和地址传递。(1)传值调用传值调用 例例3.7 3.7 传值调用。传值调用。#include#include void void swap(intswap(int

25、x,x,intint y)/y)/形参为普通类型的变量形参为普通类型的变量 coutcoutxtyxtyendlendl;intint temp=x;temp=x;x=y;x=y;y=temp;y=temp;coutcoutxtyxtyendlendl;void main()void main()intint x=3,y=5;x=3,y=5;swap(xswap(x,y);/,y);/实参为变量实参为变量 coutcoutxtyxtyendlendl;运行结果如下:运行结果如下:3 53 5 5 3 3 53 5(2)传地址调用 例3.8 传地址调用。#include void swap(in

26、t*x,int*y)/形参为指针类型的变量 int temp=*x;*x=*y;*y=temp;void main()int x=3,y=5;swap(&x,&y);/实参为变量的地址 coutxtyendl;运行结果如下:5 33.返回值传递形式返回值传递形式 函数的返回值通过值传递、地址传递和引用传递时,分别称函数的返回值通过值传递、地址传递和引用传递时,分别称为返回拷贝、返回地址或返回引用,这里只介绍返回拷贝和返回为返回拷贝、返回地址或返回引用,这里只介绍返回拷贝和返回地址。地址。(1)(1)返回拷贝返回拷贝 这是这是C+C+默认的返回值传递形式。所谓返回拷默认的返回值传递形式。所谓返回

27、拷贝指的是,在定义函数时将函数的返回值声明为普通类型,并用贝指的是,在定义函数时将函数的返回值声明为普通类型,并用returnreturn语句返回常量、变量或表达式。执行语句返回常量、变量或表达式。执行returnreturn语句时,系统语句时,系统会在内存中生成一个临时变量,并将常量、变量或表达式的值拷会在内存中生成一个临时变量,并将常量、变量或表达式的值拷贝到该临时变量中。该临时变量的生存期到函数调用所在语句执贝到该临时变量中。该临时变量的生存期到函数调用所在语句执行完毕结束,可以在函数返回后被主调函数临时使用。行完毕结束,可以在函数返回后被主调函数临时使用。(2)(2)返回地址返回地址

28、所谓返回地址指的是,在定义函数时将函数所谓返回地址指的是,在定义函数时将函数的返回值声明为指针类型,并用的返回值声明为指针类型,并用returnreturn语句返回地址。如果希望语句返回地址。如果希望在函数返回后继续使用其返回值作为变量的地址,从而对该地址在函数返回后继续使用其返回值作为变量的地址,从而对该地址中的内容进行各种操作,则被取地址的变量必须要有较长的生存中的内容进行各种操作,则被取地址的变量必须要有较长的生存期,即在函数调用所在语句执行完毕,该变量在内存中仍然存在。期,即在函数调用所在语句执行完毕,该变量在内存中仍然存在。3.3.4 函数形参的缺省值函数形参的缺省值 例例3.9 3

29、.9 形参带缺省值的函数。形参带缺省值的函数。#include#include void void show(intshow(int=1,double=2.3,char=A);/=1,double=2.3,char=A);/声明函数时为声明函数时为其形参指定缺省值其形参指定缺省值 void main()void main()show();/3 show();/3个形参的初值个形参的初值皆采用缺省值皆采用缺省值 show(5);/show(5);/第第2 2、3 3个形参个形参的初值皆采用缺省值的初值皆采用缺省值 show(6,7.8);/show(6,7.8);/第第3 3个形参的初个形参的初

30、值采用缺省值值采用缺省值 show(2,3.5,B);/3show(2,3.5,B);/3个形参的初值个形参的初值皆采用实参给定的值皆采用实参给定的值 void void show(intshow(int i,double d,char c)i,double d,char c)coutcouti,d,ci,d,cendlendl;3.3.5 函数重载函数重载C+C+中,在同一个作用域内,只要函数的形参有中,在同一个作用域内,只要函数的形参有所不同,即形参的类型、个数或顺序有所不同,所不同,即形参的类型、个数或顺序有所不同,两个或多个函数可以使用同样的名字。这种情况两个或多个函数可以使用同样的名

31、字。这种情况称为函数重载,各同名函数称为重载函数。仅仅称为函数重载,各同名函数称为重载函数。仅仅返回类型不同是不行的。返回类型不同是不行的。对于重载函数,编译器会根据调用函数时的实对于重载函数,编译器会根据调用函数时的实参类型,自动确定到底应该调用哪一个。因此,参类型,自动确定到底应该调用哪一个。因此,函数重载常用于定义功能类似但处理不同类型之函数重载常用于定义功能类似但处理不同类型之数据的多个函数。数据的多个函数。例3.10 求不同类型数据之平方的函数。#include int square(int i)/求int类型数据的平方 return i*i;double square(double

32、 f)/求double类型数据的平方 return f*f;void main()coutsquare(100)endl;/实参为int类型 coutsquare(1.5)endl;/实参为double类型 3.3.6 内联函数内联函数在在C+C+里,可以在函数的声明或定义之前冠以关里,可以在函数的声明或定义之前冠以关键字键字inlineinline,将函数声明为内联函数。对于内联,将函数声明为内联函数。对于内联函数来说,编译器在调用处嵌入经过适当处理的函数来说,编译器在调用处嵌入经过适当处理的代码,完成函数的功能,然而并不发生真正的函代码,完成函数的功能,然而并不发生真正的函数调用,也就省去

33、了函数调用的开销。数调用,也就省去了函数调用的开销。但是,如果一个内联函数被多处调用,可执但是,如果一个内联函数被多处调用,可执行文件的长度就会增加很多,反而可能降低执行行文件的长度就会增加很多,反而可能降低执行效率。因此,一般仅将那些代码比较短且循环调效率。因此,一般仅将那些代码比较短且循环调用的函数声明为内联函数。用的函数声明为内联函数。例例3.11 内联函数的应用。#include inline void display(int i)/将display()函数声明为内联函数 coutiti*iti*i*iendl;/输出i、i2、和i3 void main()for(int i=0;i

34、100;i+)display(i);/循环调用display()函数 3.3.7 递归函数递归函数在函数体内直接或间接调用函数本身。通过递归,可以将在函数体内直接或间接调用函数本身。通过递归,可以将复杂的问题逐步转化为越来越简单的问题,最后转化为不复杂的问题逐步转化为越来越简单的问题,最后转化为不需要再向下递归的最小问题。有了最小问题的解之后,再需要再向下递归的最小问题。有了最小问题的解之后,再逐步返回,依次得到较大问题的解,最终得到原有问题的逐步返回,依次得到较大问题的解,最终得到原有问题的解。解。使用递归函数的优点是,能够让程序语言的描述与问使用递归函数的优点是,能够让程序语言的描述与问题

35、的自然描述相一致。但是,函数每递归一次,都需要保题的自然描述相一致。但是,函数每递归一次,都需要保存一次现场,函数形参和局部变量也都需要重新分配一次存一次现场,函数形参和局部变量也都需要重新分配一次内存,每次返回时也都需要恢复现场,并撤销函数形参和内存,每次返回时也都需要恢复现场,并撤销函数形参和局部变量所占用的内存,开销必然很大。而且,可以利用局部变量所占用的内存,开销必然很大。而且,可以利用循环来解决几乎所有递归问题。故一般不再使用递归函数。循环来解决几乎所有递归问题。故一般不再使用递归函数。3.4 标识符与名称空间标识符与名称空间1.名称空间的定义名称空间的定义 C+中,可以利用关键字n

36、amespace来定义名称空间,将全局作用域进一步划分为不同的作用域。定义名称空间的一般形式如下:namespace 名称空间名 语句序列;(1)指定标识符所属的名称空间指定标识符所属的名称空间 一般形式如下:名称空间名:标识符 这种方法的好处是,能够保证其唯一性。但是,也有缺点,那就是每次使用时都需要指定标识符所属的名称空间。如果名称空间名比较长,就很不方便。为此,C+允许为名称空间取别名,若别名比较短,就比较方便。为名称空间取别名的一般形式如下:namespace 名称空间别名=名称空间原名;(2)指定使用名称空间中的特定标识符指定使用名称空间中的特定标识符 一般形式如下:using 名称

37、空间名:名称空间中的标识符;在某个作用域内出现如上语句时,则从该处开始,直到该作用域结束,都可以直接使用所指定的标识符,不必再指定它所属的名称空间。所指定的标识符就像全局标识符那样。(3)指定使用名称空间中的全部标识符指定使用名称空间中的全部标识符 一般形式如下:using namespace 名称空间名;例例3.14 3.14 名称空间的定义与使用。名称空间的定义与使用。#include#include namespace A namespace A intint a=10;/a=10;/在名称空间在名称空间A A内定义变量内定义变量 namespace B namespace B inti

38、nt f(intf(int x);/x);/在名称空间在名称空间B B内声明函数内声明函数 intint B:f(intB:f(int x)/x)/在名称空间外定义名称空间在名称空间外定义名称空间B B内声明的函数内声明的函数 return x+return x+A:aA:a;/;/使用名称空间使用名称空间A A中的变量中的变量a a namespace A /namespace A /为名称空间为名称空间A A追加定义追加定义 intint f(intf(int x)/x)/在名称空间在名称空间A A内定义函数内定义函数 return x*a;/return x*a;/使用本名称空间中的变量

39、使用本名称空间中的变量a a void main()void main()using using A:fA:f;/;/使用名称空间使用名称空间A A中的函数中的函数f()f()coutcoutf(10)f(10)endlendl;/;/调用名称空间调用名称空间A A中的函数中的函数f()f()coutcoutB:f(10)B:f(10)endlendl;/;/调用名称空间调用名称空间B B中的函数中的函数f()f()运行结果为:运行结果为:100100 20 203.5 数数 组组程序运行之前数组的大小必须已知。int a5,b34,c234;二维数组可以看作是由多个一维数组组成的,例如上面的

40、二维数组,可以看作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;int data10=0,1,2,3,4,5,6,7,8,9;int f(int index)return dataindex;/返回数组元素 voi

41、d 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&stri;/返回数组元素的地址 i+;static char msg=not find;return msg;/返回数组名 void main()char str100,c;coutstr;coutc;coutfind(str,c)en

42、dl;/数组名作为实参 指针的概念2 指针的定义和使用指针是一个变量,在程序中使用时,先声明,后使用。在指针声明的同时也可以进行初始化。指针的定义:指针的定义:存储类型存储类型 数据类型数据类型 *指针变量名指针变量名例如:int*p1;static int*p2;char*da;指针变量的赋值:指针变量的赋值:1、用变量的地址给指针变量赋初值;2、用相同类型的指针变量赋初值;3、赋空值NULL指针变量的初始化方法:赋空值NULL或0;用已定义变量的地址;如:int a,b,*p;p=&a;如:int a;int *p1,*p2;p1=&a;p2=p1;如:int*p;p=NULL;或 p=0

43、;指针变量的应用:指针变量的应用:应用:通过指针变量访问所指变量应用:通过指针变量访问所指变量(1)将指针变量)将指针变量指向指向被访问的变量被访问的变量(2)访问)访问所指变量所指变量 取内容:取内容:b=*p;存内容:存内容:*p=100;若若*P出现在出现在“=”的的右边右边或其他表达式中则为或其他表达式中则为取内容取内容;若若*P出现在出现在“=”的的左边左边则为则为存内容存内容如:int a,*p;p=&a;写出下面各表达式的结果,并找出具有等价关系的是式子:int a=5,*p=&a;&*p *&a (*p)+&a a *p+*(p+)a+思考:下列表达式是何含义?有什么要求?&*

44、p *&a p a3 void指针和const指针在C+语言中,可以声明指向void类型的指针。指向void类型的指针称为void指针。在声明指针时,还可以用关键字const进行修饰,用关键字const修饰的指针称为const指针。1 void指针指针一般来说,只能用指向相同类型的指针给另一个指针赋值,而在不同类型的指针之间进行赋值是错误的。比如:int a,b;int*p1=&a,*p2=p1;/正确而:int a;int*p1=&a;double*p2=p1;注意:上述语句中的两个指针p1,p2指向的类型不同,因此,除非进行强制类型转换,否则它们之间不能相互赋值。但是void指针是一个特例

45、。空类型(void)指针:不指定指针指向一个固定的类型,仅仅是用来存放一个地址。定义格式为:void*p;void*p;比如:int a;int*p1=&a;void*p2=p1;int*p4=(int*)p2;注意:void指针它可以指向任何类型的C+数据。不过,如果需要将void指针的值赋给其他类型的指针,则需要进行强制类型转换。2 const指针指针 关键字const放在不同的位置表示的意义也不相同:(1)关键字const放在指针类型前,就是声明一个指向常量的指针。此时,在程序中不能通过指针来改变它所指向的值,但是指针本身的值可以改变,即指针可以指向其他数据。(2)关键字const放在“

46、*”号和指针名之间,就是声明一个指针常量(也称常指针)。因此,指针本身的值不可改变,也即它不能再指向其他数据,但它所指向的数据的值可以改变。(3)关键字const在上述两个地方都加,则是声明一个指向常量的指针常量,指针本身的值不可改变,它所指向的数据的值也不能通过指针改变。4 指针与数组 要访问或使用一个数组元素,可以用三种不同的方法。一种是下标法,另一种是地址法,还有一种是指针法。1.下标法下标法这种方法在前面已学习过,即指出数组名和下标值,系统就会找到该元素。数组用其下标变化实行对内存中的数组元素进行处理。例如,程序中说明了一个数组:int a5;则编译系统在一定的内存区域为该数组分配了存

47、放int型数据的5个连续存储空间,它们分别是a0,a1,a5。则ai表示从数组存储首地址开始的第i个元素变量。在程序中通过i的变化就可以处理数组中的任何元素。ai就是用下标法表示的数组元素。2.地址法地址法前面已经介绍,一个数组名代表它的起始地址。地址法即通过地址访问某一数组元素。例如,程序中说明了一个数组:int a5;则a的值就是数组的起始地址,即a指向a0,a+1指向a1,。同样,a+i是ai的地址,通过a+i的地址可以找到ai元素,即*(a+i)就是ai。例如:要访问数组元素a3,下面两种方式是等价的:a3 下标法*(a+3)地址法从另一个角度来看,a+i和&ai是相等的,都是ai的地

48、址。注意要区分ai和&ai二者的不同含义,ai是a数组第i个元素的值,而&ai是ai元素的地址。3.指针法指针法除上述两法之外,还可以定义一个指针变量,指向一数组元素。例如:若程序中同时说明了一个int型指针;int*pa;并且通过指针赋值运算;pa=a;或pa=&a0;则指针pa就指向了数组a的首地址。这里指针的目标变量*pa就是a0。根据上节介绍的指针运算的原理,*(pa+1)就是a1,*(pa+2)就是a2。即*(pa+i)就是ai。对于二维数组,又是如何用指针访问其中的每个数组元素的呢?例如,定义了一个二维数组a:int a35;a是以一个3*5的二维数组,它有三行,每一行都有其起始地

49、址。C+语言规定以a0,a1,a2分别表示第0行,第1行,第2行的起始地址,即该行第0列元素的地址。注意a0,a1,a2并不是一个元素,而是一行首地址,正如同一维数组名是数组起始地址一样,a0的值等于&a00,a1的值等于&a10,a2的值等于&a20。在同一行中是同样的类推方式,比如:a0+1的值等于&a01,a1+2的值等于&a12,。因此,对于二维数组中的元素aij有多种访问方法。以下是其中的一部分:假设定义了一个二维数组:int a23;则对它的访问方法有:*(*(a+i)+j)*(ai+j)*(a+i)j*(a+3*i+j)如果用指针法访问二维数组中的元素,处理的方法也有许多种。假设

50、定义了一个指向上述二维数组a首元素的指针p,以下列出一部分通过这个指针访问数组元素aij的方法:*(*(p+i)+j)*(pi+j)*(p+i)j*(p+3*i+j)pij对于三维以上的多维数组,访问数组元素的方法在原理上是一样的,只是在使用时一定要注意C+中多维数组中各元素在内存单元中的存储顺序。并且,在利用指针访问数组元素时,同样要注意越界问题。2 数组指针与指针数组数组指针与指针数组数组指针就是一个指向数组的指针;指针数组就是其元素为指针的数组。数组指针数组指针 数组指针是一个指向一维数组的指针变量,定义数组指针的格式为:数据类型数据类型(*指针名)指针名)常量表达式常量表达式;例如:i

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com