指针与引用的区别
- 引用不能为空,所以定义后马上要赋值,比如:int &ref;这样是不够的。指针则不然,可以为空NULL
- 在使用引用之前不需要测试它的合法性,而指针需要,防止其为空
-
指针可变,引用不行
类的this指针
- this指针式实例化一个对象后产生的,并且指向对象本身
- this只能在成员函数中使用,实际上成员函数默认的第一个参数是T*const this,比如:class A{public: int fun(int p){}};在编译器看来是:int fun(A* const this, int p);
- 因此this在成员函数开始时构造,在函数结束后清除
- 这样开起来,成员函数就变成: A::fun(&a, 10);这个样子了,和静态函数没有什么区别了,唯一的区别就是编译器一般会对this指针最优化,所以this的传递效率比较高,一般通过ecx寄存器传递的。ecx寄存器是CPU所含有的四个数据寄存器(EAX、EBX、ECX和EDX)之一,一般用于计数,不过也可以作为指针寄存器,大部分的C/C++编译器约定使用ecx传递this指针
-
在C++中类和结构只有一点不同:类的成员默认为private,而结构式public
各种指针
- 函数指针:void (*pf)()
- 函数返回指针:void* pf()
- const指针:const int*
- 指向const的指针:int* const
关于函数指针:对于一个函数比如void fun(int x),它在内存中有一个物理位置,它的函数名就是这块内存的首地址,通过定义一个指针void (*pfun)(int),赋值:pfun=&fun,然后就可以通过指针来执行函数了:(*pfun)(x);
各种变态指针示例
- float(**def)[10]; def是一个二级指针,它指向一个一维数组的指针
- double*(*def)[10]; def是一个指向一维数组的指针,数组中的数据为double的指针
- double(*f[10])(); f首先是一个数组,这个数组的元素都是函数(返回double,没有参数)指针。
- int*((*b)[10]); b是一个一维数组的指针,数组元素为int*
- long(*fun)(int); fun是一个函数指针,参数为int,返回值为long
- int(*(*f)(int,int))(int); f是一个函数指针,它的参数为int,int,返回一个函数指针,返回的指针指向一个有int参数并且返回int的函数
总结下,要理解这些指针首先要知道指针的一些标准形式:int *p[]是指针数组,int(*p)[]是指向数组的指针,int(*p[])=int*p[],int(*p)()是函数指针,int*p()是函数声明,然后再仔细分析应该就可以了。
本文详细解析了C++中指针与引用的主要区别,包括引用必须初始化、不可为空以及不可改变等特性。此外,还介绍了类的this指针的概念、用法及其在成员函数中的默认传递方式。

被折叠的 条评论
为什么被折叠?



