师兄毕业了,留给我一本c专家编程。今日略读几章,发现此书内容尚可,就是翻译的不好,导致有些内容无法一下子就理解,现就其中的几点内容做详细分析。

1.“3.3 优先级规则”与“3.4 通过图表分析c语言声明”,这一点内容我觉得写的非常好,比较适于分析复杂的c语言声明,就不给大家做展开分析了。

2. typedef int (*array_ptr)[100]

int (*array_ptr)[100]是数组指针,这里特别要与int *array_ptr[100]区分开来,根据c语言中符号的优先级规则,[]优先级要高于*,因此array_ptr先与[100]结合,代表array_ptr首先是一个数组,再与*结合,代表array_ptr中共包括100个int*类型的数据,这100个int*指针又可能分别指向不同的int数据,因此从总体上看int *array_ptr[100]是一个二维数组。以上分析过程可以使用“3.3 优先级规则”与“3.4 通过图表分析c语言声明”中介绍的方法进行分析。而int (*array_ptr)[100]首先是一个指针,而后这个指针指向一个一维数组,这个一维数组的长度是n。因此从总体上看int (*array_ptr)[100]也是一个二维数组,但其第一维仅有一个数据。

这里给大家推荐一篇blog,其中的一幅图可以加深大家对上述两个变量的内存布局的认识。

http://www.cnblogs.com/mq0036/p/3382732.html

既然以上两个变量都是二维数组,那么就都可以把以上两个变量指向二维数组。具体的赋值方法可以参考上述blog,在此就不给大家复制了。

给大家对上述问题采用一个更加简单的描述方式,int (*array_ptr)[100]也可以写为int (*)[100] array_ptr的形式。通过这种形式array_ptr的类型就更加一目了然了,array_ptr是一个指向数组的指针,因此array_ptr+1则是移动100个sizeof(int)字节,因此array_ptr+1则指向了数组最后一个元素的下一个元素,但此时array_ptr的类型仍然是int (*)[100]。

3. typedef 与 #define的区别

先给大家分享一些我在网上找到的资料

http://developer.51cto.com/art/201104/256060.htm

http://www.cnblogs.com/kerwinshaw/archive/2009/02/02/1382428.html

最直观的一个区别就是typedef 与 #define的用法是相反的,如下:

typedef    int       INT;
#define    INT       int

虽然在程序中都可以使用INT,但#define在预处理结束后便再次被换为int,而typedef是定义了int类型的别名,是语言编译过程的一部分。通过以上对比就可以发现两种方法的作用时间不同,#define是在编译的预处理阶段发挥作用,但typedef在编译阶段有效。

4. 定义和声明的区别

定义:只能出现在一个地方,确定对象的类型并分配内存。

声明:可以多次出现,描述对象的类型,用于指代其他地方定义的对象。

这里要注意的是,由于声明过程中不需要分配内存,因此不需要提供关于数组长度的信息。在声明多维数组时,需要提供除最左边一维之外其他维的长度。

5. 定义为指针,但以数组方式引用

在探讨这个问题前首先要对数组变量的引用方式进行分析,其引用方式可分为通过数组方式或指针方式进行引用。

1)通过数组方式对变量进行引用的运行时步骤为:

运行时步骤1:取i的值,将它与数组基地址相加。

运行时步骤2:取地址中的内容。

2)通过指针方式对变量进行引用的运行时步骤为:

运行时步骤1:取得符号表中p的地址,提取存储于此处的指针。

运行时步骤2:把下标所表示的偏移量与指针的值相加,产生一个地址。

运行时步骤3:访问上述地址,取得字符。

通过以上分析可以发现运行时系统对于数组引用与指针引用的处理方式不同。因此当定义为数组,引用为指针时,其运行步骤为:首先取数组0的内容,加上偏移量形成地址,最后解引用获得数据,但此时地址是错误的,因此通过以上方式就无法获得正确的数据。上述引用方式往往会造成段错误。

c专家编程3、4章读书笔记相关推荐

  1. Python编程:从入门到实践第六章读书笔记6.3遍历字典

    Python编程:从入门到实践第六章读书笔记6.3遍历字典 #coding:gbk#6.3.1遍历所有的键-值对 user_0 = {'username': 'efermi','first': 'en ...

  2. 《Android编程权威指南》-读书笔记(七) -处理旋转设备

    <Android编程权威指南>-读书笔记(七) -处理旋转设备 旋转设备会改变设备配置(device configuration).设备配置是用来描述设备当前状态的一系列特征.这些特征包括 ...

  3. 《构建之法》第4.17章读书笔记

    <构建之法>第4.17章读书笔记 第四章 原文语句: 异常不能跨过DLL或进程的边界来传递信息,所以异常不是万能的. 提出问题: 1.什么是DLL?DLL是来解决什么问题的? 网上说法: ...

  4. Spring Boot 核心编程思想-第二部分-读书笔记

    怕什么真理无穷 进一步有近一步的欢喜 说明 本文是Spring Boot核心编程思想记录的笔记,书籍地址:Spring Boot编程思想(核心篇): 这篇文档会记录这本我的一些读书的思考,内容可能比较 ...

  5. 《编程匠艺》读书笔记

    <编程匠艺>读书笔记之一 <编程匠艺>读书笔记之二 <编程匠艺>读书笔记之三 <编程匠艺>读书笔记之四 <编程匠艺>读书笔记之五 <编 ...

  6. 《编程之美》读书笔记19: 3.9 重建二叉树

    <编程之美>读书笔记19: 3.9 重建二叉树 对根节点a以及先序遍历次序P和中序遍历次序I,查找a在I中的位置,将I分为两部分,左边部分的元素都在a的左子树上,右边的元素都在a的右子树上 ...

  7. 《深入理解计算机系统》第七章读书笔记

    <深入理解计算机系统>第七章读书笔记 第七章:连接 连接 1.连接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.这个文件可被加载或拷贝到存储器并执行. 2.连接可以执行于编译 ...

  8. 《编程之美》读书笔记08:2.9 Fibonacci序列

    <编程之美>读书笔记08:2.9 Fibonacci序列 计算Fibonacci序列最直接的方法就是利用递推公式 F(n+2)=F(n+1)+F(n).而用通项公式来求解是错误的,用浮点数 ...

  9. Android深度探索--HAL与驱动开发----第五章读书笔记

    第五章主要学习了搭建S3C6410开发板的测试环境.首先要了解到S3C6410是一款低功耗.高性价比的RISC处理器它是基于ARMI1内核,广泛应用于移动电话和通用处理等领域. 开发板从技术上说与我们 ...

  10. 期权、期货及其他衍生产品 第四章读书笔记 利率

    期权.期货及其他衍生产品 第四章读书笔记 利率 利率的种类 我国的利率体系 中央银行利率 金融机构利率 金融市场利率 利率的度量 连续复利利率和与之等价的每年m次复利利率的关联 零息利率 债券定价 债 ...

最新文章

  1. C#设置Cookies
  2. 二分类神经网络的特征光谱---2-3至2-9
  3. 程序员常犯的五个非技术性错误
  4. 【转摘】Word中查找与替换的妙用
  5. Python常用模块之re模块
  6. 作为前端开发,如何高效学习 TypeScript
  7. Java最佳实践–字符串性能和精确字符串匹配
  8. 用iArduino app+以太网插板实现“iPhone,iPadiPod无线控制Arduino”!
  9. Windows系统中搭建Python编译环境
  10. 面试官常问的web前端问题大全(10道面试真题祝你旗开得胜)
  11. STM32 ADC工作原理
  12. try固定搭配_【昂立推荐】初中英语动词固定搭配大全,值得收藏!
  13. IE11主页被篡改解决方法
  14. Linux 查询系统日志
  15. Struck: Structured Output Tracking with Kernels
  16. 国际最新LOGO设计趋势总结
  17. 网站服务器垃圾清理,服务器安全狗垃圾清理功能操作教程
  18. php前台限制输入text字符,限制字符输入数功能(jquery版和原生JS版)
  19. matlab圈和叉,画圈圈和画叉叉的区别
  20. quartz获取定时任务下次执行的时间

热门文章

  1. Activiti中国式流程开源项目
  2. 某工业巨头MES+SCADA+APS技术方案及项目推进计划
  3. 数据库MySQL之如何查看表?
  4. github 网速问题
  5. asp.net957-网上招聘信息管理系统
  6. 【渝粤教育】电大中专常用电器与PLC控制作业 题库
  7. 一个微信 QQ 链接屏蔽检测监控工具,可加域名池,可 API 回调 及微信通知
  8. 基于web的实验教学管理系统java ssm教学视频平台源码和论文
  9. 我爱说英语之学美语发音
  10. angular常见面试题及答案