指针与指针变量的区别与应用

指针与指针变量:
    一、指针:
        定义:《数据类型》 &《指针名》;
        作用(及局限性):储存单个变量的地址,或储存数组单个下标内容的地址,可以做函数的形参(如:void swap(int &x,int &y)或int swap(int &x,int &y))
        禁忌:不能割裂赋值,不能直接获得数组地址(仅能获得数组下标内容地址)
    二、指针变量:
        定义:《数据类型》 *《指针变量名》;
        作用:
            (1)指针变量可以定义动态数组:
                格式:
                    1、定义一个动态数组大小控制变量(必需为整型),如:int n;
                    2、定义一个指向基本数据类型(int、double、char)的指针变量,如:double(int、char) *p;
                    3、创建指针变量的实例,如:p=new double(int、char)[n];
                    4、使用循环按下标输入动态数组:
                        for(i=0;i<n;i++)        while(i!=n)
                        {                {
                            cin>>p[i];        或          cin>>p[i];
                                            i++;
                        }                }
                    5、若要输出,也是使用循环按下标输出动态数组:
                        for(i=0;i<n;i++)            while(i!=n)
                        {                    {
                            cout<<p[i]<<"\t";        或          cout<<p[i]<<"\t";
                                                   i++;
                        }                    }
            (2)可以做指向二维数组的指针变量:
                格式:
                    1、【直接地址法:指针变量指向数组首地址,《循环控制变量》<行*列,依次递增】:
                    (a)数值型:
                        int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
                        int *P;
                        cout<<"指向二维整型数组的指针变量[直接地址法:指针变量指向数组首地址,《循环控制变量》<行*列,依次递增]:"<<endl;
                        for(P=&a[0][0];P<&a[0][0]+12;P++)
                        {
                            cout<<*P<<"\t";
                        }
                        cout<<endl;


                    2、【间接地址法:指针变量指向数组首元素内容,先行后列,依次递增】:
                    (a)数值型:
                        int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
                        int *P;
                        cout<<"指向二维整型数组的指针变量[间接地址法:指针变量指向数组首元素内容,先行后列,依次递增]:"<<endl;
                        for(P=*a;P<*(a+2)+4;P++)
                        {
                            cout<<*P<<"\t";
                        }
                        cout<<endl;    
                    (b)字符型:
                        char b[3][4]={{"ABC"},{"EFG"},{"IJK"}};
                        char *P_S;
                        cout<<"指向二维字符型数组的指针变量[间接地址法:指针变量指向数组首元素内容,先行后列,依次递增]:"<<endl;
                        for(P_S=*b;P_S<*(b+2)+3;P_S++)
                        {
                            cout<<*P_S<<"\t";
                        }
                        cout<<endl;
                作用:快速历遍数组
                禁忌:指向字符型二维数组的指针变量,不可以使用直接地址法输出
            (3)指针变量可以作函数的形参,如:char *QKG(char *s)或char QKG(char *s)
            (4)指针变量可以做函数类型,如:char *QKG(char *s)或char *QKG(char s)    
            (5)指针变量可以使用->(结构指向运算符)和.(域运算符)指向结构体类型,如:
                struct Data
                {
                    int year;
                    int month;
                    int day;
                };
                Data d={2017,2,6},*p=&d;//获得整个结构体块地址
                cout<<(*p).year<<"-"<<(*p).month<<"-"<<(*p).day<<endl;//指向结构体类型中子类型地址
                cout<<p->year<<"-"<<p->month<<"-"<<p->day<<endl;//指向结构体类型中子类型地址
            (6)指针变量可以指向函数,如:double (*F)(double);//格式:《需指向的函数数据类型》 (*p)(需指向的函数形参的数据类型)
                                    //禁忌:指针变量指向的函数类型不能是无返回值的函数,也不能指向有多个形参的函数    
             (7)指针变量可以指向含有M个数值的一维数组指针变量,如:
                1、定义3行4列的二维数组,及指向4个数值的一维数组指针变量*p:int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}},(*p)[4];
                2、【地址位移法,指针变量获得二维数组首地址,先行后列,历遍输出】:
                    for(p=a;p<a+3;p++)
                    {
                        for(int j=0;j<4;j++)
                        {
                            cout<<*(*p+j)<<"\t";
                        }
                        cout<<endl;
                    }
                3、【双重指针变量法,定义另一个指针变量指向指向含有M个数值的一维数组指针变量,先行后列,历遍输出】:
                    for(p=a;p<a+3;p++)
                    {
                        for(int *q=*p;q<*p+4;q++)
                        {
                            cout<<*q<<"\t";
                        }
                        cout<<endl;
                    }
        作用:快速历遍数组
        禁忌:指针变量指向单个变量必需使用取地址运算符&,指针可以指向任意类型的数组,但是如果想用指针变量导出数组则必需要使用取内容运算符*
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值