语言基础-指针与引用

指针

指针的声明
string *ps1, ps2;表示一个指向string类型的指针和string类型的对象。
string *ps1, *ps2;表示两个指向string类型的指针。
指针保存0值,表明不指向任何对象。

*p++(*p)++: *p++先进行取值,然后对指针地址执行++操作;(*p)++是先进行取值操作,然后对该值进行++操作。

typedef
给已存在的类型名起一个别名,而且原类型名仍然有效。

typedef float MYFLOAT;
typedef char* CHARPOINTER;

typedef char* String_t; 和 #define String_d char*; 的区别:
前者声明一个类型的别名,在编译时处理,有类型检查;后者是一个简单的替换,在预编译时处理,无类型检查。比如,String_t a,b;中a,b都是char*类型的,但String_d a,b;中只有a是char*类型的,b是char类型的。

void* 指针
可以保存任何类型对象的地址。不允许使用void* 指针操纵它所指向的对象。

注意:当函数返回值为void*时,表示返回一个特殊的指针类型,而不是像void一样表示无返回值。

函数指针
函数指针是指向函数而并非指向对象的指针。函数指针指向某个特定的函数类型,函数类型由函数的返回类型和形参列表决定,与函数名无关。

bool (*pf)(const string &, const string &);

pf为指向函数的指针,所指向的函数带有两个const string&类型的形参和bool类型的返回值。pf两侧的小括号是必须的。

用typedef简化函数指针的定义

typedef bool (*cmpFcn)(const string &, const string &);

该定义表示cmpFcn是一种指向函数的指针的类型名字。该类型为“指向返回bool类型并带有两个const string引用形参的函数的指针”。要使用这种函数指针类型时,直接使用cmpFcn即可。

引用函数名但没有调用该函数时,函数名将被自动解释为指向函数的指针。

bool lengthComp(const string &, const string &);
cmpFcn pf1 = 0;          //pf1不指向任何函数
cmpFcn pf2 = lengthComp; //pf2指向函数lengthComp

函数指针的初始化:同类型的函数;同类型的函数指针;0。

函数指针的使用
指向函数的指针可用于调用它所指向的函数。
lengthComp("hi", "bye");可以写为pf2("hi", "bye");

c++允许函数指针指向重载的函数,指针类型必须要与重载函数的一个版本精确匹配,包括参数类型和返回值类型。

引用

引用本质上还是指针,只不过这个指针不能修改,任何对它的操作都会发生在这个指针所指向的地方,而不是指针本身。所以,C++中规定,一旦定义了引用,就必须把它与一个变量绑定起来,并且不能修改这个绑定。

不能定义引用类型的引用。

使用引用与指针的区别:

  • 引用不能为空,引用被创建时就必须初始化。指针可以为空。
  • 引用初始化之后就不能改变对它的对象的引用。指针随时可以改变指向。
  • sizeof(引用) 得到的是所指向的变量(对象)的大小,sizeof(指针) 得到的是这个指针本身的大小。
  • 任何对引用的操作都是针对引用所关联的对象的值,与引用本身无关。
  • 引用就相当于原对象的一个别名,使用时不用解引用,指针需要解引用。
  • 如果返回动态分配的对象或内存,必须使用指针,引用可能造成内存泄漏。
  • 使用&运算符,对引用操作取得的是所引用的变量的地址;对指针操作取得的是指针的地址。

const引用
当引用对象为const时,引用也必须是const。

const int ival = 1024;
const int &ref = ival;//正确
int &ref = ival;//错误

const引用(常引用)通常用来定义一个普通变量的只读属性的别名,作为函数的传入形参,避免实参在调用函数中被以外修改。

引用类型做类的数据成员

  • 不能直接在构造函数里初始化,必须用初始化列表。
  • 凡是有引用类型的数据成员的类,必须定义构造函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值