第一章
- for循环和while循环的区别
在for循环中,循环控制变量的初始化和修改都放在语句头部分,形式较简洁,且特别适用于循环次数已知的情况。在while循环中,循环控制变量的初始化一般放在while语句之前,循环控制变量的修改一般放在循环体中,形式上不如for语句简洁,但它比较适用于循环次数不易预知的情况(用某一条件控制循环)。两种形式各有优点,但它们在功能上是等价的,可以相互转换。
第二章
2.1基本内置类型
-
一个字(word)由4或8字节(byte)构成,一个字节由8比特(bit)构成;
-
字符串实际是由常量字符构成的数组,编译器在字符串结尾加“\0”,所以实际长度比本身内容多1,例字符串“A”包含两个字符
2.2变量 -
对象(object)是一块能存储数据并具有某种数据类型的内存空间;
-
默认初始化:如果定义变量时未指定初值,则变量会被默认初始化
默认初始化的三条性质:
(1)定义在任何函数体外的变量会被初始化为0;
(2)定义在函数体内部的变量不会被初始化;
(3)类的对象未被初始化,则初值由类决定 -
声明与定义
声明:声明确定变量名字和类型,使用变量前必须先声明
定义:申请存储空间,可能会赋予初始值
extern int i; //声明不定义
extern int pi=3; //定义int j; //声明且定义
变量可多次声明,但只能一次定义; -
新建的局部变量可以覆盖同名的全局变量,::reused可以显式的访问全局变量
2.3复合类型:引用和指针
引用(reference):定义引用时,程序会把引用及其初始值绑定在一起,而不是将初始值拷贝给引用(引用即别名)
例:
int &refval = ival; //refval指向ival(refval是ival的另一个名字)
refval = 2; //把2赋给refval指向的对象,即赋给ival
int ii = refval //与ii = ival一样
int &ref3 = refval; //ref3与refval绑定,ref3与ival绑定
*注意:*引用的类型与绑定对象一致,引用所绑定的初始值必须是对象,不能是值;
指针(pointer):指向另外一种类型的复合类型,指针存放某个对象的地址
指针的类型必须与其所指对象的类型一致
例:
int*ip1,*ip2,ip5; // ip1和ip2都是指向int 型对象的指针,ip5是int;
int ival=42;
int *p=&ival; //p存放ival的地址,或说p是指向变量ival的指针,或说初始值是int 型对象的地址;
cout<<*p; //由解引用符“*”得到指针p所指的对象,输出42;
int *p3=p; //初始值为int类型对象的指针,也就是指针的指针
*p=0; //为p所值的对象赋值
cout<<*p;//输出0;
int *p2=p; //初始值是指向int型对象的指针;
p2=&ival; //p2指向ival;
*p2=0; //ival的值被改变为0,指针p2没有改变,
指针和引用的区别::(1)指针本身是一个对象,允许对指针赋值和拷贝,可先后指向不同的对象;
(2) 引用本身并非一个对象,引用只能绑定一次对象;
(3)指针无需在定义时赋初值;
空指针:不指向任何对象
例:
int *p1=nullptr;
int *p2=0;
int *p3=NULL;
void*指针:可存放任意类型对象的地址
指向指针的指针:
int ival =1024;
int *pi=&ival; //pi指向一个int型的数,pi是指向int型数的指针
int **ppi=π //ppi指向一个int型的指针,ppi是指向int型指针的指针
cout<<ival;//输出1024;
cout<<*pi; //输出1024;
cout<<**ppi; //输出1024;//**
指向指针的引用:
int i=42;
int *p; //p是一个int型指针
int *&r=p; //r是一个对指针p的引用
r=&i; //令p指向i;
*r=0; //将i值改为0;
2.4 const:把变量定义成常量,const对象必须初始化
const int i=9; // 编译时初始化