zoukankan      html  css  js  c++  java
  • 多操作赋的语义判断(如 int& *a和int* &a) 沉沉_

      C++语言经常会有涉及到多操作符的变量或者数组定义,怎么判断其语义着实让人费解,下面谈谈我的个人理解,如有不对,请留言并谈谈您的理解。

      首先用一个小小的测试程序:

    #include <iostream.h>

    void main()
    {
     int intOne = 6;
     int& rInt=intOne; 

     int *pp=&intOne;

    // int& *p = &intOne; //编译错误,不能定义指向引用的指针;

    // int& *p = &rInt; //编译错误,同样不能定义指向引用的指针;

     int* &p = pp;   //编译正确,可以定义指针的应用

     cout<<intOne<<endl;//输出为6

     cout<<rInt<<endl; //输出为6

    cout<<intOne<<"  "<<&intOne<<endl;

     cout<<*pp<<"  "<<pp<<endl;
     cout<<*p<<"  "<<p<<endl;//输出同上两行,地址为intOne的地址

     }

           上面的测试程序很简单,容易混淆的地方在于int & * p和int * & p的区别。这两种表达式无外乎两种含义:指向引用的指针和引用指针的引用。

    通过实验结果可以看出,后一种的是正确的,而前一种是错误的。我们知道引用变量可以引用指针和常规变量,而指针不可以指向应用。实验结果说明后面一种是引用指针的引用。

    我是这样理解的: 既然实验结果表明 int * &p是一个引用,那么我们可以这样理解:上述表达式可以这样写

    (int *)(&p):(&p)表明这是一个引用,(int*)表明这是应用指针变量的引用。对比一下:

    int *a=int (*a):(*a)表明a是一个指针,int 表明这是一个指向int 的指针;

    int &a=int (&a):(&a)表明a是一个引用,int 表明这是一个引用int 的引用;

    int *a[5]:(int *)(a[5]) a[5] 表明定义的是一个数组,int *表明定义的是一个成员为指针的数组。

    上述例子表明当有多个操作符修饰变量时,变量和最后的一个组合,前一个和类型说明符组合,然后再来分析语义。

    --未完待续

  • 相关阅读:
    String驻留带来的危害
    Go语言的堆栈分析
    SecureCRT使用技巧
    Javascript中相同Function使用多个名称
    记录Office Add-in开发经验
    Silverlight和WPF中DataContractJsonSerializer对时间的处理差异
    ASP.NET MVC项目实践技巧
    有点担心Node.js的未来了
    回首经典的SQL Server 2005
    duilib关于学习Demo中的QQ
  • 原文地址:https://www.cnblogs.com/chenchenluo/p/2216747.html
Copyright © 2011-2022 走看看