第3章 数据

c中,仅有4中基本数据类型——整型、浮点型、指针和聚合类型(如数组和结构等)。

整型:字符、短整型和长整型,它们都分为有符号(signed)和无符号(unsigned)。

  short int至少16位,long int至少32位。

  ANSI C允许命名常量(named constant, 声明为const的变量),它被初始化后值就不能改变。

如何把一个值当作字符常量使用:

value = value - 48;

  value = value - \60;

  value = value - '0';

枚举类型

  枚举(enumerated)类型就是指它的值为符号常量而不是字面值类型:

  enum Jar_Type{CUP,PINR,QUART,HALF_GALLON,GALLON};

  enum Jar_Type milk_jug, gas_can, medicine_bottle;

==

  enum {CUP, PINT, QUART, HALF_GALLON, GALLON} milk_jug,gas_can,medicine_bottle;

  这种类型的变量实际上以整型的方式存储,这些符号名的实际值都是整型值。这里CUP是0,PINT是1,以此类推。

  你可以为这些符号名指定特定的整型值。

  enum Jar_Type{CUP = 8, PINT = 16, QUART = 32, HALF_GALLON = 64, GALLON = 128};

  只对部分符号名用这种方式进行赋值也是合法的。如果某个符号名未显式指定一个值,那么它的值就比前面一个符号名的值大1。

浮点类型

  浮点数家族包括float、double和long double类型。

  浮点数面值在缺省的情况下都是double类型的,除非它的后面跟一个L或l表示它是一个long double类型的值,或者跟一个F或f表示它是一个float类型的值。

指针

  变量的值存储于计算机的内存中,每个变量都占据一个特定的位置。每个内存位置都由地址唯一确定并应用。指针只是地址的另一个名字罢了。指针变量就是一个其值为零一个(一些)内存地址的变量。

  一、指针常量(pointer constant)

  指针常量与非指针常量在本质上是不同的,因为编译器负责把变量赋值给计算机内存中的位置,程序员事先无法知道某个特定的变量将存储到内存中的那个位置。因此,你通过操作符获得一个变量的地址而不是直接把它的地址写成个字面值的常量形式。例如,如果我们希望知道变量xyz的地址,我们无法书写一个类似oxff2044ec这样的字面值,因为我们不知道这是不是编译器实际存官方这个碧昂两的内存位置。事实上,当一个函数每次被调用时,他的自动变量(局部变量)可能每次分配的内存位置都不相同。因此,把指针常量表达为数值字面值的相识几乎没有用处。

  二、字符串常量(string literal)

  C语言不存在字符串类型。

  ANSI C申明如果对一个字符串常量进行修改,其效果是未定义的。

  是因为在程序中使用字符串常量会生成一个"指向字符的常量的指针"。当一个字符串常量出现于一个表达式中时,表达式所使用的值就是这些字符所存储的地址,而不是这些字符本身。

  下面两个效果等价:

  unsigned short int a;

  unsigned short    a;

  int 在默认情况下是有符号的。

  C数组另一个值得注意的地方是,编译器并不检查程序对数组下标的引用是否在数组的合法范围内。

  如果下标值是从那些已知是正确的值计算得来,那么就无需检查它的值。如果一个用作下标的值是根据某种方法从用户输入数据产生而成,那么在使用它之前必须进行检测,确保它们位于有效的范围之内。

  声明指针

  int *a;

==

  int* a;

但是 int* a,b,c;

!=

  int *a,*b,*c;

typedef

  C语言支持一种叫做typedef的机制,它允许你为各种数据类型定义新名字。

  char *ptr_to_char;

  ptr_to_char是字符指针;

  typedef char *ptr_to_char;

  ptr_to_char a;

  声明a是一个指向字符的指针。

  提示:

  你应该使用typedef而不是#define来创建新的类型名,后者无法正确处理指针类型。

  #define d_ptr_char char*

  d_ptr_to_char a,b;

  b无法声明称一个指针。

常量

  const int a;

pointers on c (day 1,chapter3)的更多相关文章

  1. Leetcode 笔记 117 - Populating Next Right Pointers in Each Node II

    题目链接:Populating Next Right Pointers in Each Node II | LeetCode OJ Follow up for problem "Popula ...

  2. Leetcode 笔记 116 - Populating Next Right Pointers in Each Node

    题目链接:Populating Next Right Pointers in Each Node | LeetCode OJ Given a binary tree struct TreeLinkNo ...

  3. [LeetCode] Populating Next Right Pointers in Each Node II 每个节点的右向指针之二

    Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ...

  4. [LeetCode] Populating Next Right Pointers in Each Node 每个节点的右向指针

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  5. [c++] Smart Pointers

    内存管理方面的知识 基础实例: #include <iostream> #include <stack> #include <memory> using names ...

  6. LEETCODE —— Populating Next Right Pointers in Each Node

    Populating Next Right Pointers in Each Node Given a binary tree struct TreeLinkNode { TreeLinkNode * ...

  7. LeetCode OJ 116. Populating Next Right Pointers in Each Node

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  8. Pointers and Dynamic Allocation of Memory

    METHOD 1: Consider the case where we do not know the number of elements in each row at compile time, ...

  9. LeetCode - Populating Next Right Pointers in Each Node II

    题目: Follow up for problem "Populating Next Right Pointers in Each Node". What if the given ...

随机推荐

  1. 介绍对称加密的另一个算法——PBE

    除了DES,我们还知道有DESede(TripleDES,就是3DES).AES.Blowfish.RC2.RC4(ARCFOUR)等多种对称加密方式,其实现方式大同小异,这里介绍对称加密的另一个算法 ...

  2. 常用的网络命令--之...... Ipconfig详解

    ipconfig是运行微软的Windows9x/NT/2000/XP/Vista操作系统的电脑上用来控制网络连接的一个命令行工具.它的主要功用,包括用来显示现时网络连接的设置(/all参数),或通过/ ...

  3. Google map markers

    现已被屏蔽 http://mabp.kiev.ua/2010/01/12/google-map-markers/ Надо по немногу отходить от празднывания но ...

  4. Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数、ColModel API、事件及方法

    系列索引 Web jquery表格组件 JQGrid 的使用 - 从入门到精通 开篇及索引 Web jquery表格组件 JQGrid 的使用 - 4.JQGrid参数.ColModel API.事件 ...

  5. [Fluent NHibernate]第一个程序

    目录 写在前面 Fluent Nhibernate简介 基本配置 总结 写在前面 在耗时两月,NHibernate系列出炉这篇文章中,很多园友说了Fluent Nhibernate的东东,也激起我的兴 ...

  6. C# 中的委托和事件(转)

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  7. PHP系统声明式事务处理

    转自:http://www.jianshu.com/p/34261804bc45 1.数据库事务 事务(Transaction)是并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都执行, ...

  8. Bash 中的环境变量

    在 Bash 里,可以通过 export 命令查看当前 Shell 进程的环境变量,这些环境变量一些是 Bash 自己创建的,还有一些是 Bash 从父进程继承来的,然而需要注意的是,父进程传给 Ba ...

  9. 【Json】关于json解析时异常org.json.JSONException: A JSONObject text must begin with '{' at character 1 of {的解决方法

    遇到这种异常有几种情况: 1.JSON格式有问题,检查一下格式. 2.格式没问题,仍然报错,这个是因为你的json文件头里带有编码字符(如UTF-8等),读取字符串时json串是正常的,但是解析就有异 ...

  10. 【piu~】制作一只变形小鸡~

    在http://codepen.io/pick上看到的,,,具体是谁忘了,反正我只截了最萌的一段,作者越改越不萌ಥ_ಥ 谷哥哥随便一搜就有很多好玩的,度娘就...(  ̄ ▽ ̄)o╭╯☆#╰ _─﹏─) ...