《Pointers On C》读书笔记(第三章 数据)
1.在C语言中,仅有4种基本数据类型:整型、浮点型、指针和聚合类型(如数组和结构等)。
整型家族包括字符、短整型、整型和长整型,它们都分为有符号和无符号两种。
标准规定整型值相互之间大小的规则:长整型至少应该和整型一样长,而整型至少应该和短整型一样长。
ANSI标准规定了各种整型值的最小允许范围,如下表所示:
| 类 型 | 最小范围 |
| char | 0~127 |
| signed char | -127~127 |
| unsigned char | 0~255 |
| short int | -32767~32767 |
| unsigned short int | 0~65535 |
| int | -32767~32767 |
| unsigned int | 0~65535 |
| long int | -2147483647~2147483647 |
| unsigned long int | 0~4294967295 |
枚举类型定义中的符号名被当作整型常量处理,声明为枚举类型的变量实际上是整数类型。但是,把枚举变量同整数无差别地混合在一起使用会削弱它们值的含义,实践中应尽量避免。
2.浮点数家族包括float(单精度)、double(双精度)和long double(扩展精度)类型。ANSI标准规定:long double至少和double一样长,而double至少和float一样长。标准同时规定了一个最小范围:所有浮点类型至少能容纳从10-37~1037之间的任何值。
浮点数字面值在缺省情况下都是double类型的,除非它的后面跟一个L或l表示它是一个long double类型的值,或者跟一个F或f表示它是一个float类型的值。
ANSI C标准声明如果对一个字符串常量进行修改,其效果是未定义的。在实践中,应尽量避免修改字符串常量。如果确需修改字符串,应将其存储于字符数组中。
3.在声明整型变量时,如果声明中已经至少有了一个其他的说明符,关键字int可以省略。
signed关键字一般只用于char类型,其他整型类型在缺省情况下都是有符号数。至于char是否是signed,则因编译器而异。
4.数组的下标总是从0开始的,最后一个元素的下标是元素的数目减1。
C编译器并不检查程序对数组下标的引用是否在数组的合法范围内。这种不加检查的行为有好处也有坏处。好处是不需要浪费时间对有些已知是正确的数组下标进行检查,坏处是这样做将使无效的下标引用无法被检测出来。
5.C语言支持一种叫做typedef的机制,它允许你为各种数据类型定义新名字。其声明格式与普通的声明基本相同,只是要把关键字typedef放在声明的前面。
实践中,通常应该使用typedef而不是#define来创建新的类型名,因为后者无法正确地处理指针类型。
6.const关键字涉及到指针变量的几种情况:
int *pi; //pi是一个普通的指向整型的指针
int const *pci; //pci是一个指向整型常量的指针。可以修改指针的值,但不能修改指针所指向的值。
int * const cpi; //cpi是一个指向整型的常量指针。可以修改指针所指向的值,但不能修改指针的值。
int const * const cpci; //cpci是一个指向整型常量的常量指针。指针的值和指针所指向的值均不能修改。
7.标识符的作用域就是程序中该标识符可以被使用的区域。编译器可以确认4种不同类型的作用域:文件作用域、函数作用域、代码块作用域和原型作用域。
标识符的链接属性决定如何处理在不同文件中出现的标识符。链接属性一共有3种:external、internal和none。没有链接属性的标识符(none)总是被当作单独的个体,也就是说该标识符的多个声明被当作独立不同的实体;属于internal链接属性的标识符在同一个源文件内的所有声明都指同一个实体,但位于不同源文件的多个声明则分属不同的实体;属于external链接属性的标识符不论声明多少次、位于几个源文件都表示同一个实体。
关键字extern和static用于在声明中修改标识符的链接属性。static只对缺省链接属性为external的声明才有改变链接属性为internal的效果。当extern用于源文件中一个标识符的第1次声明时,它指定该标识符具有external链接属性。但是,如果它用于该标识符的第2次或以后的声明时,它并不会改变由第1次声明所指定的链接属性。
变量的存储类型是指存储变量值的内存类型。有3个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。凡是在任何代码块之外声明的变量总是存储于静态内存中,也就是不属于堆栈的内存,这类变量称为静态变量。如果不指定其初始值,默认初始化为0。在代码块内部声明的变量的存储类型是自动的,它存储于堆栈中,称为自动变量。如果声明中加上关键字static,则它的存储类型变为静态。如果自动变量没有指定初始值,则其默认值为垃圾。关键字register可以用于自动变量的申明,提示它们应存储于机器的硬件寄存器而不是内存中,这类变量称为寄存器变量。
8.当static用于函数定义或代码块之外的变量声明时,它用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响。
当static用于代码块内部的变量声明时,它用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。
《Pointers On C》读书笔记(第三章 数据)的更多相关文章
- 《C和指针》读书笔记——第三章 数据
1.typedef:为各种数据类型定义新名字 typedef char *ptr_to_char; ptr_to_char a;//声明a是一个指向字符的指针. 2.链接属性:extern;stat ...
- 《Linux内核设计与分析》第六周读书笔记——第三章
<Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...
- 《Linux内核设计与实现》读书笔记 第三章 进程管理
第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...
- 《CSS3实战》读书笔记 第三章:选择器:样式实现的标记
第三章:选择器:样式实现的标记 选择器的魔力在于,让你完全实现对网页样式的掌控.不同的选择器可以用在不同的情况下使用.总之把握的原则是:规范的编码,根据合理地使用选择器,比去背选择器的定义有价值的多. ...
- 《linux内核设计与实现》读书笔记第三章
第3章 进程管理 3.1 进程 1.进程 进程就是处于执行期的程序. 进程包括: 可执行程序代码 打开的文件 挂起的信号 内核内部数据 处理器状态 一个或多个具有内存映射的内存地址空间 一个或多个执行 ...
- 《R语言实战》读书笔记--第三章 图形初阶(二)
3.4添加文本.自定义坐标轴和图例 很多作图函数可以设置坐标轴和文本标注.比如标题.副标题.坐标轴标签.坐标轴范围等.需要注意的是并不是所有的绘图函数都有上述的参数,需要进行验证.可以将一些默认的参数 ...
- .net架构设计读书笔记--第三章 第9节 域模型实现(ImplementingDomain Model)
我们长时间争论什么方案是实现域业务领域层架构的最佳方法.最后,我们用一个在线商店案例来说明,其中忽略了许多之前遇到的一些场景.在线商店对很多人来说更容易理解. 一.在线商店项目简介 1. 用例 ...
- STL源码分析读书笔记--第三章--迭代器(iterator)概念与traits编程技法
1.准备知识 typename用法 用法1:等效于模板编程中的class 用法2:用于显式地告诉编译器接下来的名称是类型名,对于这个区分,下面的参考链接中说得好,如果编译器不知道 T::bar 是类型 ...
- 深入Java虚拟机读书笔记第三章安全
为什么需要安全性 Java的安全模型是其多个重要结构特点之一,它使Java成为适于网络环境的技术.Java安全模型侧重于保护终端用户免受从网络下载的.来自不可靠来源的.恶意程序(以及善于程序中的bug ...
随机推荐
- C#中的Attributes的用法
今天研究了一下C#中的Attributes的用法,感觉很有用,现总结以下: 在前台用JS写的脚本方法,除了可以直接用在前台控件的属性中,还可以在后台运用. 即在后台页面加载时,调用JS方法.语法格式有 ...
- 20个命令行工具监控 Linux 系统性能
对于每个系统管理员或网络管理员来说,每天要监控和调试 Linux 系统性能问题都是非常困难的工作.我已经有5年 Linux 管理员的工作经历,知道如何监控系统使其保持正常运行.为此,我们编写了对于 L ...
- Java中如何把两个数组合并为一个
在Java中,如何把两个String[]合并为一个? 看起来是一个很简单的问题.但是如何才能把代码写得高效简洁,却还是值得思考的.这里介绍四种方法,请参考选用. 一.apache-commons 这是 ...
- cocos2dx3.3在Windows环境搭建以及新工程创建
这个虽然比较简单,但是是学习cocos的第一步,不积跬步无以至千里,所以今天先分享Windows下环境搭建问题.关于mac搭建后续有机会在写(ps:因为我暂时没有mac),anyway,开始吧! 首先 ...
- 套接字编程(VC_Win32)
简介(源于维基) Berkeley套接字(也作BSD套接字应用程序接口)刚开始是4.2BSD Unix操作系统(于1983发布)的一套应用程序接口.然而,由于AT&T的专利保护着UNIX,所以 ...
- 转:IIS请求筛选模块被配置为拒绝超过请求内容长度的请求
HTTP错误404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求,原因是Web服务器上的请求筛选被配置为拒绝该请求,因为内容长度超过配置的值(IIS 7 默认文件上传大 ...
- linux c 头文件
//1.Linux中一些头文件的作用: #include <assert.h> //ANSI C.提供断言,assert(表达式) #include <glib.h> //GC ...
- Cortex-M3 动态加载一(地址无关代码实现)
这篇文章是自己疑惑究竟地址无关性是如何实现,然后查看汇编和CPU指令手册,最后分析解除自己疑惑的,高手不要鄙视,哈哈. 编译C代码时候需要制定--acps/ropi选项,如下例子: void Syst ...
- 19.java.lang.NoClassDefFoundException
java.lang.NoClassDefFoundException未找到类定义错误 当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误. 违背安全原则异常:Secturit ...
- [原]命令模式在MVC框架中的应用
其实在项目开发中,我们使用了大量的设计模式,只是这些设计模式都封装在框架中了,如果你想要不仅仅局限于简单的使用,就应该深入了解框架的设计思路. 在MVC框架中,模式之一就是命令模式,先来看看模式是如何 ...