第3章C++基本语法主要内容13.1数据类型23.2常量和变量33.3运算符和表达式43.4语句53.5小结3.1数据类型程序中的各种加工和处理都是针对某些数据进行的,这些数据由数据类型描述。数据类型规定了数据的存储结构(在内存中占据的大小和布局)、可以进行的运算、取值范围。C++中的数据类型大致分为三类:C++预定义的一组内置的基本数据类型,表示常见的简单数据,如整数、浮点数等;复合类型,由基本数据类型组合而成的更复杂的数据类型,如数组、结构体、联合、枚举等;类类型,即用户自己定义的抽象数据类型。为了方便程序员,C++标准库中还提供的一些常用的抽象数据类型。2常量和变量3运算符和表达式4语句5小结数据类型13.1.1内置数据类型字符类型字符型char,通常用来表示单个字符和小整数。整数类型整型int、短整型short、长整型long,分别代表不同长度的整数值char、short、int和long类型都可以用signed和unsigned修饰浮点类型浮点型float、双精度浮点型double和长双精度longdouble布尔类型bool类型只有两个值:true和false。----------------------------------------bool类型、char类型、各种整数类型通称为整值类型。整值类型和浮点类型一起被称为算术类型。2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型内置数据类型的空间大小标准C++对内置数据类型的空间大小并没有做出严格规定,但为了编写可移植的代码,应该了解你所使用的编译器和机器,避免对这些特性做出某种假定。如下代码可以测试C++编译器为每种数据类型分配的空间大小:2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型#includeiostreamusingnamespacestd;intmain(){coutsizeof(char)endl;coutsizeof(int)endl;coutsizeof(float)endl;coutsizeof(double)endl;coutsizeof(bool)endl;return0;}VisualC++6.0和DEV-C++结果:144813.1.2指针类型指针持有一个对象的地址,通过指针可以间接操作这个对象。指针的典型用法:构建链式的数据结构,如链表和树管理程序执行时动态分配的对象作为函数的参数每个指针都有相关的类型,需要在定义指针时指出。不同类型的指针的表示方法和保存的地址值并没有分别,区别只是在于指针指向的对象类型不同。指针的类型指出了如何解释该内存地址保存的内容,以及该内存区域应该有多大。例如:int*pi;//指向整型的指针,如指向内存地址是1000,则跨越的地址空间是1000~1003char*pc;//指向字符型的指针,如指向内存地址是1000,则只占据1000这个字节的区域2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型空指针指针值为0时表示它不指向任何对象,即空指针。指针不能保存非地址值,也不能被赋值或初始化为不同类型的地址值。2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型intival=100;int*pi=&ival;//pi被初始化为ival的地址int*pi2=0;//pi2不指向任何对象pi2=ival;//编译错误doubledval=1.5;pi=&dval;//编译错误通用指针C++提供了一种通用指针,即void*指针,它可以持有任何类型的地址值。不能操纵void指针指向的对象,只能传送该地址值或和其他地址进行比较。C++也不允许void指针到其他类型指针的直接赋值。2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型inta=10;charch=‘k’;void*pv=&a;//OKpv=&ch;//OKint*pi=pv;//错误,应该使用pi=(int*)pv通过解引用操作(*)可以间接访问指针指向的对象。intx=100,y=20;int*pi=&x;*pi=y;//x=y指针的算术运算指针可以进行加或减整数值的算术运算,这时地址值增加数目取决于指针的类型。指针只有在指向数组元素时,其算术运算才有意义。2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型inta=10;charch=‘k’;int*pi=&a;char*pc=&ch;pi++;//在原地址值上加4;因为int占4个字节pc++;//在原地址值上加1;因为char占1个字节3.1.3引用类型引用又称为别名,它可以作为对象的另一个名字。通过引用我们可以间接操纵对象,使用方式类似于指针,但是不需要指针的语法。在程序中,引用主要用作函数的形参。引用由类型标识符和一个取地址符(&)来定义,引用必须被初始化。2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型intival=100;//OK,refVal是指向ival的引用int&refVal=ival;//Error,引用没有初始化int&refVal2;//Error,不能用对象的地址来初始化引用int&refVal3=&ival;int&refVal4=10;//Error,不能用没有内存地址的数值来初始化引用引用的注意事项(1)引用一旦定义,就不能再指向其他的对象,对引用的所有操作都会被应用在它所指向的对象上。例如:intx=100,y=20;int&r=x;//r是x的引用r=y;//r不是y的引用,而是x=y2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型引用的注意事项(2)注意引用的初始化和赋值极为不同:初始化时引用“指向”一个对象,赋值时,引用被作为所指对象的别名。虽然C++标准没有规定引用的实现方式,但是在很多C++编译器中,引用被实现为与所指对象占据同一地址空间,例如下面的代码:#includeiostreamusingnamespacestd;intmain(){inta=10;int&ra=a;couta=a\t&a=&aendl;coutra=ra\t&ra=&raendl;ra=20;couta=a\t&a=&aendl;coutra=ra\t&ra=&raendl;}在GNUC++编译环境的输出结果如下:a=10&a=0x22ff34ra=10&ra=0x22ff34a=20&a=0x22ff34ra=20&ra=0x22ff342常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型引用与指针的差别(1)定义与初始化指针的定义形式:类型*指针变量;指针的初始化:intx=10,y=20;int*pi;//可以不初始化pi=&x;//p指向int类型的对象xpi=&y;//p也可以重新指向y引用的定义形式:类型&引用名=初始值;引用的初始化:定义引用时必须用有内存地址的对象初始化。引用在初始化之后,一直指向该对象。例如:inta=10,b=20;int&ri=a;//必须初始化ri=b;//等同于a=b;2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型引用与指针的差别(2)使用方式指针通过解引用(*)运算间接访问指向的对象;引用作为对象的别名,可以直接访问对象。例如:pi=&x;*pi=30;//x=30int&ri=a;ri=40;//a=402常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型引用与指针的差别(3)指针可以不指向任何对象,引用必须指向一个对象。pi=0;//pi是空指针,不指向任何对象ri=0;//a=02常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型引用与指针的差别(4)指针之间的相互赋值会改变指向关系;引用之间的相互赋值是它们指向的对象之间的赋值,引用关系本身并不改变。intx=100,y=20;int*p1=&x,*p2=&y;p1=p2;//p1=&y,p1和p2都指向yint&r1=x,&r2=y;r1=r2;//x=y,r1仍是x的引用2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型3.1.4数组数组是一个单一数据类型对象的集合。其中的单个对象没有命名,但可以通过它在数组中的位置进行访问,即下标访问。例如://ia是包含10个int对象的数组intia[10];//数组中下标为3的元素被赋值为7ia[3]=7;2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型定义数组定义数组时需要指定类型名、数组名标识符和数组大小。数组大小是一个不小于1的常量表达式。数组元素的下标从0开始,到数组大小-1。但是,C++并不提供对数组下标范围的检查,需要程序员自己保证正确性。定义数组的同时可以对数组进行初始化,初始值放在花括号中,用逗号隔开。intia[3]={1,2,3};intib[]={4,5,6,7};intic[10]={0,1,2};2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型数组的注意事项一个数组不能被另一个数组初始化,也不能被直接赋值给另一数组。C++也不允许声明一个引用数组,例如:intia[3]={1,2,3};intib=ia;//!Errorint&ria=ia;//!Errorintival1=0,ival2=1;int&r[2]={a,b};//!Errorint&rv1=ival1,&rv2=ival2;intrv[2]={rv1,rv2};//OK2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型C风格字符串C++保留了C语言中用字符数组表示字符串的方式,称为C风格字符串。可以通过库函数对这样的字符串进行操作。需要包含标准库头文件cstring2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型多维数组定义多维数组,每一维的大小由一对方括号指定。例如:intia[4][3];访问多维数组的元素要指定每一维的下标。例如:ia[1][2]=5;多维数组也可以被初始化:intia[3][2]={{0,1},{2,3},{4,5}};2常量和变量3运算符和表达式4语句5小结数据类型1•内置数据类型•指针类型•引用类型•数组•结构体•联合•枚举•类类型数组与指针数组名字代表数组第一个元素的地址,它的类型是数组元素类型的指针。例如对下面的数组定义:intia[5];ia是一个int*类型,ia和&ia[0]都表示第一个元素的地址。因而,除了使用下标访问数组元素之外,还可以使用指针对数组进行访问。intmain(){inta[10];inti;in