指针
指针的声明
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引用(常引用)通常用来定义一个普通变量的只读属性的别名,作为函数的传入形参,避免实参在调用函数中被以外修改。
引用类型做类的数据成员
- 不能直接在构造函数里初始化,必须用初始化列表。
- 凡是有引用类型的数据成员的类,必须定义构造函数。
1638

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



