Warning: 自家学习专用__by Arthur
Nouns
- 变量(或可称为对象):提供一个具名的、可供程序员操作的存储空间;(建议在使用的时候再去定义,确保作用域的正确性)。定义方式:数据类型 + 声明符
- 复合类型(compound type):基于其他类型定义的类型,如数组、指针、引用、结构体;
- 静态类型语言(如C++):在编译阶段检查类型。类型决定能够进行的操作,编译器检查数据类型是否支持要执行的运算;
- 分离式编译:允许把程序拆分成多个逻辑部分编写,该机制将程序分割成若干个文件,每个文件可被独立编译,这就涉及到“声明”与“定义”的概念;
- 引用(reference):间接访问,为对象起了两外一个名字,引用类型引用了(refers to)另外一种类型。通常我们所说的“引用”指左值引用(lvalue reference)。
int val = 110; //声明并初始化
int& refVal = val; //引用,refVal指向val,即为val的别名,这一动作必须在定义引用的同时进行,绑定(bind),无法再次绑定
- 指针(pointer):间接访问,是指向另一种类型的符合类型,是对象,可赋值,存储的是被指向对象的地址;
int val = 120; //声明并初始化
int* valPtr = &val; //指针指向变量val,即将val的地址存在了指针变量valPtr中
cout << *valPtr << endl; //解引用操作“*”,输出120,与定义指针符号“*”的作用不同
- 空指针(null poiter),不指向任何对象,生成方式:
int* ptr1 = nullptr;
int* ptr2 = 0;
int* ptr3 = NULL; //
- 指向指针的引用:引用非对象,不可被引用,但是指针是对象,可被引用,如
int val = 119;
int* ptr;
int* &refPtr = ptr; //引用定义:int* 表示被引用的对象还是int指针,&为定义引用的符号
refptr = &ptr; // 传入地址, 实际上是ptr获取了此地址
*refptr = 0; //解引用,将val赋新值0
//整个过程中,虽然都是在对refPtr操作,但是其仅为实际对象的“*影子*”,仍是目标仍是实际对象
Notation
- 初始化不是赋值,在定义一个变量时并给其一个初始值,此为初始化;而在程序其他地方对其值抹去并赋予新值,此为赋值。
- 引用只是被绑定对象的影子,不是对象(区别于指针,指针是对象),所有对引用进行的操作都是对本身实体进行的。
- 指针的状态有如下几种,一般可作为条件表达式、判断条件
- 指向一个对象,true
- 指向紧邻对象所占空间的下一个位置, true
- 空指针,即指针没有指向任何对象, false
- 无效指针(编译器不检查此错误,在运行时会报错)