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》读书笔记(第三章 数据)的更多相关文章

  1. 《C和指针》读书笔记——第三章 数据

    1.typedef:为各种数据类型定义新名字 typedef char  *ptr_to_char; ptr_to_char a;//声明a是一个指向字符的指针. 2.链接属性:extern;stat ...

  2. 《Linux内核设计与分析》第六周读书笔记——第三章

    <Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...

  3. 《Linux内核设计与实现》读书笔记 第三章 进程管理

    第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...

  4. 《CSS3实战》读书笔记 第三章:选择器:样式实现的标记

    第三章:选择器:样式实现的标记 选择器的魔力在于,让你完全实现对网页样式的掌控.不同的选择器可以用在不同的情况下使用.总之把握的原则是:规范的编码,根据合理地使用选择器,比去背选择器的定义有价值的多. ...

  5. 《linux内核设计与实现》读书笔记第三章

    第3章 进程管理 3.1 进程 1.进程 进程就是处于执行期的程序. 进程包括: 可执行程序代码 打开的文件 挂起的信号 内核内部数据 处理器状态 一个或多个具有内存映射的内存地址空间 一个或多个执行 ...

  6. 《R语言实战》读书笔记--第三章 图形初阶(二)

    3.4添加文本.自定义坐标轴和图例 很多作图函数可以设置坐标轴和文本标注.比如标题.副标题.坐标轴标签.坐标轴范围等.需要注意的是并不是所有的绘图函数都有上述的参数,需要进行验证.可以将一些默认的参数 ...

  7. .net架构设计读书笔记--第三章 第9节 域模型实现(ImplementingDomain Model)

        我们长时间争论什么方案是实现域业务领域层架构的最佳方法.最后,我们用一个在线商店案例来说明,其中忽略了许多之前遇到的一些场景.在线商店对很多人来说更容易理解. 一.在线商店项目简介 1. 用例 ...

  8. STL源码分析读书笔记--第三章--迭代器(iterator)概念与traits编程技法

    1.准备知识 typename用法 用法1:等效于模板编程中的class 用法2:用于显式地告诉编译器接下来的名称是类型名,对于这个区分,下面的参考链接中说得好,如果编译器不知道 T::bar 是类型 ...

  9. 深入Java虚拟机读书笔记第三章安全

    为什么需要安全性 Java的安全模型是其多个重要结构特点之一,它使Java成为适于网络环境的技术.Java安全模型侧重于保护终端用户免受从网络下载的.来自不可靠来源的.恶意程序(以及善于程序中的bug ...

随机推荐

  1. oracle ORA-00913: 值过多

    --oracle中查看表是否被锁 查看表是否被锁   SELECT /*+ rule*/   a.sid, b.owner, object_name, object_type   FROM v$loc ...

  2. Struts2配置问题java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

    方法一:右键点击项目--->build path-->configure build path-->左侧菜单栏就会看到Deployment Assembly-->右侧点击add ...

  3. 易宝网上支付平台的PHP接口代码

    本代码参照自韩顺平149讲视频后5讲,需要学习的朋友可以参考本代码 这是测试图片: 以下是代码部分: <?php function HmacMd5($data, $key) { //需要配置环境 ...

  4. Socket 服务器和客户端通信

    //服务器端package com.svse.service; import java.io.BufferedReader; import java.io.IOException; import ja ...

  5. php composer包管理工具

    一 . 包管理工具 你在Centos上装工具的时候直接yum -y install xx 比你去rpm -ivh xx.rpm 是不是爽很多呢? composer 就是安装php 代码的一个类似工具. ...

  6. 软件测试学习日志———— round 2 Junit+intellj idea 安装及简单的测试使用

    今天是软件测试的上机,主要内容是对junit的安装以及对一个简单类的测试实践.老师推荐用eclipse,但是我原来一直在 用intellj Idea,所以我试了试intellj Idea对junit的 ...

  7. Android模拟器使用笔记,学习head_first python 安卓开发章节

    学习head_first python 安卓开发那一章需要的程序android-sdk_r23.0.2-windows.zip //模拟器 PythonForAndroid_r4.apk sl4a_r ...

  8. 分享一个自用的 Inno Setup 软件打包脚本

    此脚本支持打包mysql.安装mysql服务.安装windows服务.操作ini文件.操作注册表.高效压缩文件等功能,基本能满足常用的软件打包需求. ;定义各种常量 #define MyAppName ...

  9. J2SE知识点摘记-数据库(二)

    一.          查询数据 注意sql的内容. 通过ResultSet接口保存全部的查询结果,通过Statement接口中的executeQuery()方法查询.查询之后需要分别取出.通过nex ...

  10. 自写的LastPos,寻找字符串里的最后一个字符,RTL里没有提供这个函数——Delphi的String下标是从1开始的

    已经好几次了,没有这个函数还是感觉很不方便,所以自己写了一个: function LastPos(strFind :string; ch: Char): integer; var i, n: inte ...