C/C++一些知识2(指针)

本文详细解析了C++中指针与引用的主要区别,包括引用必须初始化、不可为空以及不可改变等特性。此外,还介绍了类的this指针的概念、用法及其在成员函数中的默认传递方式。

指针与引用的区别

  • 引用不能为空,所以定义后马上要赋值,比如: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()是函数声明,然后再仔细分析应该就可以了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值