C++学习笔记(一)——引用和指针
一、引用
-
(1)引用即别名,不是对象;
引用:给对象起了另外一个名字 -
(2)引用和初始化绑定,而不是拷贝;
-
(3)引用必须初始化;
int &a; //错误 引用必须被初始化 -
(4)引用不是对象,不能定义引用的引用;
//这是合法的,不是引用的引用 int a; int &b = c; int &a = b;
//这才是引用的引用,是错误的 int &(&a);
-
(5)引用的初始化值必须是对象,不能与字面值或者某个表达式的结果绑定在一起,数据类型且一致
int &a = 10;//这是错误的 后面会用到const int &a = 10;//这是正确的 double b = 1; int &c = b; //这是错误的,引用类型必须是int类型
-
(6)引用不是对象,不能定义指向引用的指针
指针的定义中说到:指针的值(即地址)必须指向一个对象。
二、指针
-
(1)指针本身就是一个对象,允许对指针复制和拷贝;
-
(2)指针无需在定义时赋初值;
-
(3)获取对象的地址,用到取地址符&
int a = 2; int *p = &a; //p存放a的地址,或p指向变量a的指针
-
(4)因为引用不是对象,没有实际地址,所以不能定义指向引用的指针;
-
(5)指针值(4种状态):
1.指向一个对象
2.指向紧邻对象所占空间的下一个位置
3.空指针,意味着指针没有指向任何对象
4.无效指针,上述之外的值 -
(6)空指针
三种写法:int *a = nullptr; //C++11推荐这种写法 (特殊类型的字面值) int *b = 0; int *c = NULL; //NULL(预处理变量)值为0
预处理变量不属于命名空间std::
nullptr它可以转换成任意其他的指针类型,C++程序中最好使用nullptr,避免使用NULL
注意:
int变量直接赋值给指针是错误的操作,及时int值恰好为0也不行 -
(7)指针和引用的区别
指针和引用都能提供对其他对象的间接访问;
具体细节上有很大不同:
引用本身并非一个对象;
一旦定义了引用,就无法令其再绑定到其他的对象,之后每次使用这个引用都是访问最初绑定的那个对象。 -
(8)其他指针操作
int *p = 0; if(p) // pi的值为0,false { }
-
(9)void * 指针
void * 是一个特殊的指针类型,可以用于存放任意对象的地址。
==不能直接操作void * 指针所指向的对象,因为我们并不知道这个对象到底是什么类型,也无法确定能在这个对象上做哪些操作。==需要进行强制类型转换操作,表明该void*指针所指对象的类型才能使用。int i =1; void *p = &i; cout << *((int*)p) << endl; // 需要进行强制类型转换操作,才能对void *类型操作
-
(10)定义多个变量
int* p1, p2; // p1指向int的指针,p2是int //(1) int *p1, *p2; //(2) int* p1; int* p2;
-
(11)指向指针的引用
引用本身不是一个对象,所以不能定义指向引用的指针。
但是指针是对象,所以存在对指针的引用int i = 5; int *p; int *(&r) = p; //r是对指针p的引用 // 相当于 r = p 了 r = &i; //*r 现在等于5 *r = 0;// i的值现在也是0了
int *(&r) = p; 从右向左阅读 ,符号 * 修饰(&r),告诉我们 r引用的是一个int类型指针。
-
(12)指针不能指向不同类型的对象
double val = 3.4; int *a = &val; //error C2440: “初始化”: 无法从“double *”转换为“int *”