1、const指针
指向常量的指针变量,其一般形式为 "const 类型名 * 指针变量名 " 。 如下:
int a=12,b=15;
const int *p=&a;
int *q=&b;
*p=22; //非法,试图通过p修改a的值
*q=22; //一般的指针变量可以修改,合法
p=&b; //p改为指向b,合法。
2、引用
对于数据可以建立一个“引用”,它的作用是为变量起另一个别名。
int main()
{
int a=5;
int &b=a;
printf("%d\n",b);
}
以上声明了b是a的引用,即b是a的别名,这样声明后,a和b的作用是相同的,都代表同一变量。可以这样去理解:通过b去引用a。在上面的声明中,"&"是引用声明符,不代表地址。
需要注意几点:
- 引用是一种独立的数据类型。对引用只有声明,没有定义。即必须先定义一个变量,然后对该变量建立一个引用。
- 声明一个引用,必须同时使之初始化,即声明它代表哪一个变量。
- 声明另一个变量后,不能再使之作为另一个变量的引用。
- 不能建立引用数组如:
int main()
{
int a[5];
int &b[5]=a; //错误,不能建立引用数组
int &b=a[0]; //错误,不能作为数组元素的别名
} - 不能建立引用的引用。
int main()
{
int a=3;
int &b=a;
int &c=b; //建立引用的引用,错误
} - 可以取引用的地址,如声明b是a的引用,则&b就是变量a的地址。
int main()
{
int *pt;
pt=&b; //把变量a的地址&a赋给指针变量pt
}
3、运算符new和delete
C++提供了较简便而功能强大的运算符new和delete来代替malloc和free函数,因此最好不用malloc和free;
int main()
{
int m=3,n=4,i;
int **a = new int*[m]; //分配一个指针数组,将其首地址保存在a中 、
for(i = 0; i < m; i++) //为指针数组的每个元素分配一个数组
a[i] = new int [n];
//动态声明的数组,使用后需要释放内存。
for(i = 0;i < m; ++i)
delete [] a[i];
delete []a;
return 0;
}
4、对象指针
1、指向对象的指针是指向对象空间起始地址的指针,其形式和一般的变量的指针定义一样。
class Time
{
public:
int hour;
int minute;
int sec;
Time(int h,int m,int s):hour(h),minute(m),sec(s){};
void getTime(); //类的成员函数
}; void Time::getTime(){
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}; int main()
{
Time *pt;
Time t(16,58,59);
pt=&t;
pt->getTime();
return 0;
}
2、指向成员函数的指针
普通函数的指针变量一般形式如下: 类型名 (*指针变量名)(参数列表)。如下:
void fun(){
cout<<"hello world"<<endl;
}
int main(){
void(*p)(); //p是指向void型函数的指针变量
p=fun; //将fun函数的入口地址赋给指针变量p,p就指向fun函数
(*p)(); //函数调用。
return 0;
}
而定义一个指向对象成员函数的指针变量则比较复杂一些,一般采用下面这样的方式:
数据类型名 (类名 :: *指针变量名)(参数列表);
可以让他指向一个公用成员函数,只须把公用函数的入口地址赋给指向公用函数的指针变量即可。其一般形式如下:
指针变量名=&类名 :: 成员函数名;
class Time
{
public:
int hour;
int minute;
int sec;
Time(int h,int m,int s):hour(h),minute(m),sec(s){};
void getTime(); //类的成员函数
}; void Time::getTime(){
cout<<hour<<":"<<minute<<":"<<sec<<endl;
};
int main(){
Time t(20,31,30);
Time *p=&t;
p->getTime(); //通过对象指针来指向函数
void(Time::*p1)(); //定义直接指向Time类公用函数的指针p1
p1=&Time::getTime; //将P1指向公用函数getTime
(t.*p1)(); //调用对象的成员函数
return 0;
}
在main函数中的
p1=&Time::getTime;
不能写成一下形式,
p1=&t.getTime;
原因如下:成员函数不是存放在对象的空间中的,而是存放在对象外的空间中的。如果有多个同类的对象,它们公用同一段函数代码段。因此赋给指针变量的p3应该是这个公用函数代码段的入口地址,而不是通过变量对象地址获得来的函数入口。