前言:

什么叫做:声明变量是求值过程?请看下面的声明,

int i;

很简单,声明了个整型变量i,再看如下声明,

int *p;

也很简单,立刻反应出来它是指向整型的指针,但是具体如何推倒出来的呢?其实在C语言中,变量的声明就是一种求值过程,把*p这部分声明看成表达式,对这个表达式的求值的结果是int类型,这样就可以倒推出p是指针整型的指针了,因为只有对指向整型的指针进行解引用操作才是整型类型!还有很多复杂的声明,都可以使用这种方法求其具体的类型。

下面让我们来验证typedef定义的新类型和普通的声明变量一样,也是一种求值过程:

 /*
验证:
用typedef定义的新类型名声明的变量是否与普通的声明变量一样,是一种求值的过程,还是单纯的替换过程?
*/ typedef short int arrTen[]; //定义了一个新类型,这个类型是:一个包含10个short类型元素的一维数组 int main(){
short int j;
short int myarr[];
arrTen *arr1;
/*
现在需要验证arr1的类型:
假设是求值过程,那么意味着对表达式*arr1求值的结果是arrTen类型,也就是说arr1是一个指针,指向一个数组,但是在C语言中数组是一个很朴素的概念,它只是连续的内存单元,所以指向一个数组准确地说是指向一片拥有10个short元素的内存空间
假设是替换过程,那么上述声明相当于:short int *arrTen[10],而这个声明意味着arrTen是一个拥有10个元素的数组,每个元素的类型是指针,指向short类型的内存单元,在这里发现了问题,如果声明(用typedef定义(或声明)新类型时和用typedef声明变量时)用到了很多操作符,替换过程就会出现优先级的失调,所以在此猜测这种假设是错的
*/ /* 实际操作验证 */
//arr1[1]=&j; //报错,GCC5.2:error: assignment to expression with array type
arr1=&myarr; //未报错,myarr的类型是一个指向short的指针,而&myarr的类型是一个指向拥有10个short元素的数组的指针
/* 综上,arr1是一个指向数组的指针,所以第一种假设成立,typedef声明变量时也是一种求值过程 */ return ;
}

最新文章

  1. java使用tomcat7的maven插件发布到服务器
  2. mysql中event的用法详解
  3. python中的GIL(全局解释锁)多线程能够提升效率
  4. 如何关闭emacs开启时自己打开的欢迎界面
  5. Sql Server 按行处理表数据思路
  6. C#操作XML,如何获取指定节点值?
  7. 一个基于Myeclipse开发的Java打地鼠小游戏(Appletcation)
  8. 使用Maven构建Web项目
  9. 结构-行为-样式-requireJs实现图片轮播插件
  10. FZU Problem 1895 整除45问题(整除问题+字符串维护+优化)
  11. 模仿jquery的fileupload插件
  12. c语言实现封装、继承和多态
  13. ASP.NET Core中使用GraphQL - 第三章 依赖注入
  14. linux服务器时间同步失败解决方法
  15. windows下特殊字符无法用来命名
  16. chrome扩展写法
  17. 20145122《Android开发基础》实验四实验报告
  18. 《C++ Primer Plus》读书笔记之十二—C++中的代码重用
  19. 【JUC源码解析】SynchronousQueue
  20. 添加jQuery方法解析url查询部分

热门文章

  1. H3C系统调试的操作
  2. C#调用smtp邮件发送几个大坑
  3. Team Foundation Server 2015使用教程【3】:默认团队成员连接tfs及checkin操作
  4. URL统一资源定位符
  5. MBean 描述符
  6. 18.函数复习,文件处理b模式(二进制处理),文件处理其他高级玩法
  7. 第二阶段:1.流程图:11.PPT绘制页面流程图
  8. 本地项目推送到coding
  9. salesforce零基础学习(九十五)lightning out
  10. jquery中获取ajax请求返回数据的方法