C++指针


指向常量的指针:
不能通过指向常量的指针改变所指对象的值,但指针本身可以改变,可以另外指向对象。
例:
int a;
const int*p1=&a;//p1是指向常量的指针
int b;
p1=&b;//正确,p1本身的值可以改变
*p1=1;//编译出错,不能通过p1改变所指的对象
指针类型的常量:指针本身的值不能被改变
int a;
int *const p2=&a;
p2=&b;//错误

利用指针数组存放矩阵
指针数组:数组的元素是指针类型,相比二维数组,指针数组可以存放长短不一的一维数组
int line1[] = { 1,0,0 };
int line2[] = { 0,1,0 };
int line3[] = { 0,0,1 };
int *pline[3] = { line1,line2,line3 }; //定义整型指针数组并初始化
...
指针数组行与行之间不一定是连续存放的

指针类型的函数:
#include<iostream>
using namespace std;
int main(){
    int array[10];//在主函数中定义的数组
    int* search(int* a,int num);
    for(int i=0;i<10;i++)
    cin>>array[i];
    int* zeroptr=search(array,10);//将主函数中数组的首地址传给函数
    //sizeof(zeroptr)/sizeof(int)计算数组长度
    cout<<&zeroptr<<endl;
    return 0;
}
int* search(int* a,int num){//指针a指向主函数中定义的数组
for(int i=0;i<num;i++)
if(a[i]==0)
return &a[i];//返回地址指向的元素在主函数中定义的
}
使用new:在子函数中通过动态内存分配new操作取得的内存地址返回给主函数的方法是有效的,但是要记得释放动态分配的内存。

函数指针:
定义:存储类型 数据类型(*函数指针名)();
含义:函数指针指向的是程序代码存储区。
典型用处——实现函数回调
通过函数指针调用的函数:将函数的指针作为参数传递给一个函数,使得在处理相似事件的时候可以灵活的使用不同的方法。
//编写一个计算函数compute,对两个整数进行各种计算,有一个形参为指向具体算法函数的指针,根据不同的实参函数,用不同的算法进行计算
//编写三个函数:求两个整数的最大值、最小值、和。分别用这三个函数作为实参,测试compute函数
#include<iostream>
using namespace std;
int compute(int a,int b,int(*func)(int,int)){//函数指针,返回值是int类型的,参数值是int类型的
    return func(a,b);}
    int max(int a,int b)//求最大值
    {return ((a>b)?a:b);}
     int min(int a,int b)//求最小值
    {return ((a<b)?a:b);}
    int sum(int a,int b)//求和
    {return a+b;}
int main()
{
    int a,b,res;
    cout<<"请输入整数a:";
    cin>>a;
    cout<<"请输入整数b:";
    cin>>b;
    res=compute(a,b,&max);//compute(a,b,max)也是可以的,传递的都是函数的首地址
    cout<<"max of "<<a<<" and "<<b<<" is "<<res<<endl;
    res=compute(a,b,&min);
    cout<<"min of "<<a<<" and "<<b<<" is "<<res<<endl;
    res=compute(a,b,&sum);
    cout<<"sum of "<<a<<" and "<<b<<" is "<<res<<endl;
}

对象指针:
类名 *对象指针名;
例:Point a(5,10);
Point *ptr;
ptr=&a;//将Point的对象a赋值给指针
通过指针访问对象成员:
对象指针名->成员名
例: ptr->getx()相当于(*ptr).getx();
#include<iostream>
using namespace std;
class Point{
    public:
        Point(int x=0,int y=0):x(x),y(y){}//构造函数
        int getX() const{return x;}
        int getY() const{return y;}
    private:
        int x,y;
};
int main(){
    Point a(4,5);
    Point *p1=&a; //定义对象指针,用a的地址初始化
    cout<<p1->getX()<<endl;//用指针访问对象成员
    cout<<a.getX()<<endl;//用对象名访问对象成员
    return 0;
}

this指针
(1)隐含于类的每一个非静态成员函数中(属于类的函数如getX(),getY()。getX()的参数表为空好像没有传任何参数进去但是其实传递过去的是当前对象的地址,getX()中有一个隐藏的指针this,该函数的地址就传到this指针里去了,而return语句中所返回的就是this指针所指向的x)。
(2)指出成员函数所操作的对象。
当通过一个对象调用成员函数时,系统先将该对象的地址赋给this指针,然后调用成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针。
例:Point类的getX函数中的语句:
return x;
相当于:return this->x;
例:对象指针在前向引用声明中的使用(一般情况下很少使用,两个类对象相互包含互相的子对象的情况)
class Fred;//前向引用声明
class Barney{
Fred *x;
};
class Fred{
Barney y;
};

猜你喜欢

转载自blog.csdn.net/jiechou8218/article/details/80064781