现在的位置: 首页 > 综合 > 正文

C++中与指针相关的一些问题

2013年10月26日 ⁄ 综合 ⁄ 共 1721字 ⁄ 字号 评论关闭

*“指向常量的指针类型”与“指针类型的常量”
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*型指针。 

 

【上篇】
【下篇】

抱歉!评论已关闭.