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 *表明定义的是一个成员为指针的数组。

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

--未完待续

转载于:https://www.cnblogs.com/chenchenluo/archive/2011/10/18/2216747.html

多操作赋的语义判断(如 int *a和int* a)相关推荐

  1. 线程间定制化调用通信—— 1 高内聚低耦合的前提下,线程操作资源类 2 判断/干活/通知 3 多线程交互中,必须要防止多线程的虚假唤醒,也即(判断只用while,不能用if)

    生产者与消费者模式 一个生产者与一个消费者 题目:现在有两个线程,可以操作初始值为0的一个变量,实现一个线程对该变量加1,另一个线程对该变量减1,这两个线程的操作加一.减一交替,进行10轮,变量的初始 ...

  2. 微信小程序storage操作报错,判断是否能取到值

    微信小程序以wx.getStorage 报错为例(其他storage操作同理),判断是否能取到值 1.取不到值时,控制台报错 2.解决办法:添加.catch(err=>{})捕获异常 wx.ge ...

  3. 键盘I/O中断调用(INT 16H)和常见的int 17H、int 1A H

    说明:下文为转载的,下文中的"扩展码"其实就是"扫描码(scan code)"的意思 键盘扫描码:是每个键盘生产厂家为自己所生产的键盘设置的扫面方式,目的检测是 ...

  4. 汇编语言随笔(15)- 对键盘输入进行处理(int 9 和 int 16h 中断例程)

    键盘输入 1,前面讲过, int 9 中断例程负责对键盘输入进行处理,具体为:从 60h 端口读出扫描码,并将其转化为相应的ASCII码或状态信息,一起存储到内存的指定空间(键盘缓冲区或状态字节)中. ...

  5. java int 详解,int与Integer详解(java基础篇)

    前言 在回顾==与equals的区别于联系时,我们很清楚的了解到: ==:可以用于基本数据类型的比较,也可以用于对象进行比.,对于基本数据类型,比较的是值:对于引用数据类型,比较的是内存地址 equa ...

  6. C++中int a[10]和int* a=new int[10]]有什么区别

    我们常常看见,在图论中,对一个Graph类在初始化的时候,对类的成员变量**arc(邻接矩阵,是一个二维数组,大小是顶点数*顶点数,存储内容为边的权值,而且矩阵的对角线元素均为0),有如下的初始化方法 ...

  7. int *a 和 int a[ ]

    拿着邓公的数据结构复习 看到形参用的是int *a,之前鄙陋的以为,传数组不都应该是int a[]吗? 先说结论: 做形参的时候,int *a与int a[]无任何区别. int *a的 a 是一个指 ...

  8. const int * 、int * const、int const* 、const int a(){ } 和int a()const { }的区别和联系

    前言:很多人都把const int * .int * const.int const* 的区别和联系搞混,我自己在学习C++的过程中,也经常性          弄不 清楚,今天特意总结一下,作为学习 ...

  9. const int *,const int * const和int const *有什么区别?

    我总是搞砸了如何正确使用<code>const int* , const int * const和int const * . 是否有一组规则定义您可以做什么和不能做什么? 我想知道在分配, ...

  10. ((sizeof(n)+sizeof(int)-1)~(sizeof(int)-1))

    一.问题的提出 两年之前我写过一篇可变参数学习笔记,里面曾经简单的解释过一句: 代码 ((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1)) 的作用是在考虑字 ...

最新文章

  1. 嵌入式linux 升级,嵌入式Linux的OTA更新,基本原理和实现
  2. android otp接口,Android-高通平台调试camera的OTP参数
  3. SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传
  4. php中MySQL数据库导入与导出_Mysql数据库导出和导入
  5. python完全支持面向对象编程思想_面向对象的编程思想和Python的继承和多态,特殊方法,引用计数...
  6. 【SQL】电商网站各模块指标的统计以及分析
  7. MATLAB函数 zp2tf详解
  8. 电压比较器工作原理 -----运放入门,重点!!!
  9. 刚入职就写了个bug,把几万用户搞蓝屏了···
  10. mysql 存储树形结构
  11. 典型的DOS攻击技术
  12. java 气泡_JAVA实现聊天气泡
  13. 多元线性回归分析理论详解及SPSS结果分析
  14. Office Word 不显示 Citavi 插件,如何修复?
  15. Dpark的安装测试
  16. StormMedia: 一个关于暴风影音的文件夹
  17. Codeforces-1008A - Romaji - 水题
  18. 软件编程学习网站汇总——持续更新中
  19. SpringBoot sharding 分库分表使用及配置
  20. Android水平渐变色圆角矩形

热门文章

  1. python 爬虫性能_python-爬虫性能相关
  2. 清华大学计算机红皮书,哈佛的红皮书_82702698.pdf
  3. tensorflow如何微调时如何只训练后两层_XLNet只存在于论文?都替你封装好了还不来用!...
  4. mysql日期查询_mysql 查询日期
  5. mysql group by having 子句
  6. 蓝桥杯2017年第八届C/C++省赛C组第八题-九宫幻方
  7. Flutter学习 — 用占位符淡入淡出的显示图片
  8. Dart基础第1篇:Dart环境搭建、Dart开发工具
  9. 7-1 字符串的冒泡排序 (20 分)
  10. MySQL 5.7 自带的四个数据库 介绍