*“指向常量的指针类型”与“指针类型的常量”
const int* p=NULL; //定义了指向常量的指针类型
int x=0; //定义变量x
int y=0; //定义变量y
p=&x; //OK,让p指向变量x
*p=1; //Error,不能改变指向常量的指针所指地址中的值
int* const q=&y; //定义了常量指针q,并让其指向变量y
q=NULL; //Error,不能改变常量指针所指向的地址
*q=1; //OK,改变y的值为1
const int* const pq=&x; //定义了指向常量的常量指针pq
pq=&y; //Error,不能改变常量指针所指向的地址
*pq=1; //Error,不能改变指向常量的指针所指地址中的值
int* pz=NULL; //定义指针pz
const int z=0; //定义常量z
pz=&z; //Error,不能让普通指针指向常量,除非const int* pz;
*用指针向函数传递实参的地址
因为C++默认的参数传递方式是按值传递(数组除外),改变形参的值不会影响相应实参的值。这样做的优点是:避免了函数的副作用;缺点是:对于传递内存占用较大的参数时效率不高,另外,有时也限制了利用函数的副作用来得到多个返回值的情况。用指针向函数传递实参的地址解决了上述两个缺点。请看下面两个例子:
(1)void swap(int* x,int* y){int temp=*x;*x=*y;*y=temp} //利用函数的副作用
(2)void method(MyClass* mc);//提高了参数传递效率,注意,这里可能有参数副作用带来的问题
值得一提的是,如果想提高参数的传递效率但又想避免函数副作用的发生,那么“指向常量的指针”将是个不错的选择,如void method(const MyClass* mc);//在函数体中不能改变mc所指对象的内部状态.
*指针作为返回类型
在C++中,和函数的参数传递一样,函数的返回值传递方式也是按值传递的,如果不明白的话,执行一下下面的代码就会很清楚了:
#include<iostream>
using namespace std;
class MyClass
{
private:
int member;
public:
MyClass(int var){member=var;}
int getMember(){return member;}
void setMember(int param){member=param;}
};
MyClass mc(1);
MyClass method()
{
return mc;
}
void main()
{
cout<<mc.getMember()<<endl;
method().setMember(3);
cout<<mc.getMember()<<endl;
}
为了提高效率,可以把返回值类型定义成指针类型,如上面的MyClass method(){return mc}可改为MyClass* method(){return &mc};这样把method().setMember(3);改为method()->setMember(3);结果就不一样罗。要注意的是不能把局部变量的地址作为指针返回给调用者。
还有const对函数的作用也值得一提:可试着这样定义const MyClass* method()和这样定义void setMember(int param)const{member=param;},看看编译器给你反应的结果。
*函数指针
C++中可以定义一个指针变量,使其指向一个函数,定义格式为<返回类型> (*<指针变量>)(形参表) 例如下面的函数指针变量fp: double (*fp)(int);它可以指向的函数如double f(int x){...};//请注意(*fp)的(),去掉后就变成定义了返回类型为double* 的函数了。
*"int (*p)[10]"和"int *p[10]"
前者定义了一个指针变量p,它可以指向一个由10个int元素所构成的一维数组;后者定义了一个由10个元素所构成的一维数组变量,它的每一个元素是int*型指针。