《c和指针》 第三章 数据(1)

数据

    变量的三个属性: 作用域,链接属性和存储类型:这个三个属性决定了,变量的可视性,和作用域;

3.1 四种基本数据类型

    C语音中只有这四种基本数据类型,-- 整型  ,浮点型。指针和聚合类型(数组和结构), 其他所用类型都是从这四种类型组个成的;

 3.1.1 整型

    整型又分为一下几种: 字符,短整型,整型和长整型,,每一种有分为符号类型(signed)和无符号类型(unsigned)类型;

   首先需要知道的是:这种区分方式是根据每种,类型占用的内存大小决定的, 可以用sizeof( char / short int / int /long int) 来看占用的内存长度,不同的操作系统,每种数据类型占用的内存长度不同,unsigned 的最大取值范围一般为 2^(8*sizeof() ) -1,

    这里,整型,长整型,短整型的取值范围没有大小关系,只有一条规定:长整型至少和整型一行长,整型至少和短整型一样长。具体取值范围可以查看编译环境中的/usr/include/limit.h文件 

     signed 和unsigned之间的关系是:加signed 的可以取负数,而带unsigned的是只能取大于等于0的数字的。


    说明几点:

        1. 单纯的声明一个缺省的 char 类型的变量,至于是signed 还是unsigned ,这取决与编译器,不同机器决定了不同的而去之范围;char 声明了符号类型便于移植,但是可可导致效率问题(最大循环是127,变成了256); 因此最好将char变量的取值范围限定在unsigned char 和singed char 的交集。也就是 0-127 之间。

  
一  整型常量
    常量分为几种: 1. 字面值常量, 就是在代码中写死的,”acb“, 7 .'a' 这种
                            2. 声明的   const 类型的 变量,声明同时完成初始化;
                            3. #define  定义的  宏 
                           4.  枚举类型
   
   程序中出现一个整型字面值常量时,如何确定是那种类型: 取决于该字面值常量书写规范;
         1 字面值后面有大写或者小写的L时,一般是long int 类型
          2. 如果后面有大写或者小写的U时,一般是unsigned 类型的,如果没有默认是signed类型,或者缺省类型
         3. 缺省情况下,最短类型但能够完整容纳这个值的, 
            这句话的理解应收是比较char  -> unsigned char ->  short int  ->unsigneshort d  int  -> int -> unsigned int -> long -> unsigned long ; 实际上不是 一般只比较后面几个
int -> unsigned int -> long -> unsigned long   原因不知;
         4. 八进制和16进制  八进制前面加一个0(012的0,而非opq 的o) 十六进制前面是0x 
         5.  字符型常量,类型是int, 后面不能添加unsigned  和long 后缀的, 并且需要用单引号包围

 
二 枚举类型          
    枚举类型就是值他的值是符号常量而不是字面值常量 ,变量实际是以整型的方式存储,整型也就是赋值的取值范围只要是整数范围内即可;
    使用关键字  enum 构建一个枚举类型, 以下面为例 ,构建枚举类型,该类型的值只可能是这几个值
enum Jar_Type { cpu, PINT, UART, GALLON};
    声明一个枚举类型的变量:    
    enum Jar_Type , milk_jug;
    milk_jug = cpu;
    两点疑问:
     1. mikl_jug 可以进行 ++ 运算么?
     2, 声明类型时可以这样声明么?      
enum Jar_Type { CPU, PINT = -100, UART}


3.1.2 浮点型

    浮点型一般适用于带小数点的数字,或者特别大,超出整型范围的值, 浮点型包含一下几种: float, double , long double ,即单精度,双精度和只看扩展精度的精度;
    标准规定: long double 至少和double 一样长, double 至少和float 一样长
                      浮点类型至少容纳 10^(-37)  ~ 10^(37) 范围内的任何值
    浮点型的字面值一般都写成十进制形式,必须带一个小数点或者一个指数或者两者都有, 如果2E1 是啥类型? double 还是 int 类型 
    浮点类型缺省是double,除非后面带一个 F/f 代表float 类型 

3.1.3 指针

     变量的值是存储在计算机的内存中,每个变量都占据一个特定的位置,每个内存位置都是由地址唯一确定并引用的。指针只是这个内存位置的一个名字,指针变量就是一个值是另外一个内存地址的变量。
     计算机内存相当于一条长街上一间间的房子,每个房子都又唯一的号码标识,每个位置(add)(房子)内都包含一个值(nu),这个值(nu)和他的地址(add)是独立并且显著不同的,

一 指针常量
    指针常量和非指针常量在本质上是不同的,因为编译器负责把变量赋值给计算机内存中的位置,但是我们无法知道,在程序运行时,会将这个变量保存在内存中的那个位置,因此指针常量表达为数值字面值的形式几乎没有用处, 一个例外, 将指针变为空指针,赋值为0;

二 字符串常量
    C语言不同c++存在一个特定的基本类似string 类型,但是C语言提供了字符串常量, 是一串以NUL字符结尾的零个或者多个字符,字符串存储在字符数组中。
    由于NUL字符是用于终止字符串的,因此字符串内部不能出现NUL字节, 之所以选择NUL作为字符串的终止符号,是因为它不是一个可打印字符,
    字符串常量一般是以双引号包起来 ”Hello“, "";
    
    说明:    
        1.C语言中字符串存在数组中,数组在初始化时都指定了长度,因此,一个字符串数组最多存储长度-1个字符,
        2. 字符串常量中的字符能不能修改取决于编译器,有的编译器是允许修改的,但是最好不要修改,如果修改,将字符串保存在数组中,

3.2 基本声明

    变量声明基本形式:   说明符  声明表达式列表 
    对于简单的类型,声明表达式就是被声明的标识符的列表,对于更复杂的类型,声明表达式列表中的每个条目实际上都是一个表达式,显示被声明的名字的可能用途。复杂声明可以理解为对一个结构体进行声明,
    说明符 包含一下些关键字 和声明变量的类型, 同时标识符还可以改变缺省的存储类型和作用域;
int i;
char c;
unsigned short int a;


3.2.1 初始化

    在声明后,可能要给指定的变量指定一个初始值,方式是  变量名 = 值
int i = 6;
char c = 'a';
unsigned short int a = 10;

3.2.2 声明简单数组

    声明一个一维数组  说明符 变量名[整型常量]  
int values[20];
    声明了一个整型数组,数组中包含20个整型元素。数组下标总是从0开始的,最后一个下标是元素数目减1,;

3.2.3 声明指针

    声明表达式也可以用于声明指针, 
int * a;
这行表达式表示 *a  表示的效果是int 类型,*操作符执行的是间接访问操作,a 是一个指向int的指针

 3.2.4 隐式声明

    这种声明最好不要使用,因为隐式声明不确定声明的类型是恒美,不能表达意图;
      

3.3      typedef 

    C 允许将数据类型定义为新的名字, typedef声明和普通声明一样,只是讲typedef 放在声明的前面
char * ptr_to_char;

typedef char * ptr_to_char;
ptr_to_char a;
    第一个是普通的声明,将变量ptr_to_char声明为一个指向字符的指针;
    后面把标识符ptr_to_char 指向了支付的指针的信命, 就可以使用该名字代替刚才声明的类型 ,a 就是一个指向字符的指针;
    使用 typedef 声明类型,可以将复杂的声明变得很短, 
    应当使用typedef 而非#define  因为当声明指针时,可能存在错误
   <pre name="code" class="csharp">#define  d_ptr_to_char char*
d_prt_to_char a, b;

//实际变成了
char * a ,b


3.4 常量

声明常量和声明变量完全一样,只是他们的值不能改变,并且需要使用关键字 const ;
常量如何赋值
1. 声明时赋值
const int a = 15;
2. 函数中声明为const 的常量,在调用时,得到实参的值;
需要特别说明的是指针常量: 涉及到指针常量 和指向的实体;
        int const * pci ; //指向整型常量的指针, 可以修改指针的值,但是不能修改它指向的值

        int * conset pci;// 指向整型的常量指针, 指针是常量,指针指向的地址无法修改,但是可以修改它所指向的整型的值,   
    

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值