C与指针笔记第三章

第一节:基本数据类型
C语言仅有四种基本数据类型:
    1.整型
    2.浮点型
    3.指针类型
    4.聚合类型

一.整型(九种)
    1.字符
        char
        signed char 
        unsigned chars
    2.短整型
        signed short int 
        unsigned short int 
    3.整型
        signed int 
        unsigned int 
    4.长整型
        signed long int 
        unsigned long int
        
在16位平台下省缺int类型为2个字节,long也为2个字节        

整型相互之间的大小规则:
    长整型至少和整型一样长,而整型至少和短整型一样长。
    
整型在省缺情况下是int类型的。    

省缺的char要么是signed char,要么是unsigned char,这取决于编译器。
    在vs与gcc中,char是signed的。

提示:当可移植性问题比较重要时,最佳的妥协方案就是将char类型限制
    在signed char与unsigned char之间,这样获得最大的可移植性(指
    的是都声明为signed char或是un时),同时又不牺牲效率(有些机器
    在处理unsigned char时效率会受损)。
    
二.浮点类型
1.单精度:float
2.双精度:double
3.扩展精度:long double

ANSI标准规定:
    1.long double至少和double一样长,double至少和double一样
    2.标准同时规定了一个最小范围:所有浮点型最少能容纳
    10的-37次方~10的37次方之间的任何值。

浮点数在省缺情况下是double类型的。

三.指针

每个内存位置都由地址唯一确定并引用。

四.综合:常量
1.使用const定义的常量:命名常量(named constanr,声明为const的变量)
2.使用define宏定义常量
3.字面值(literal、常量、字面值常量):
    这是一种实体,制定了自身的值,并不允许发生改变
    
(一).整型字面值:编译器通过字面值的书写来确定是9种整型类型中的哪一种。
    1.在字符后面添加:
        Uu
        Ll
    2.使用8进制0ddd
    3.使用16进制0xddd
在省缺情况下,字面值类型就是(int、unsigned int、long、unsigned long)
中最短但足以容纳整个值的类型。
    
    4.字符常量:就是一个用单引号包围起来的单个字符。
        类型总是int,不能添加unsigned。
    
    5.宽字符类型    
        L'中'

(二).枚举类型:就是它们的值是自定义的符号常量而不是字面值(即不是用户直接输入数字赋值的)类型

注意:当然,也可以给枚举类型变量赋值为数字,也可以将枚举类型变量
赋值给其他整型变量。把枚举变量和整数无差别的混合在一起使用,会削弱
它们值的含义。

(三).浮点数字面值:总是写成十进制的形式,必须有一个小数或指数。
    3.14159
    1E5 --->100000
    25.
    .5
    6.023e2 ---> 602.3
(四).指针常量(pointer constant):
    指针字面值常量无意义,NULL为特例。


第二节 变量的声明
    1.变量的定义:说明符(一个或多个) 声明表达式列表(被声明的标识符列表)
        说明符(specisier):包含一些关键字,用于描述被声明的标识符的基本类型
    2.在声明变量时,如果声明中已经至少有了一个其他的说明符,int可以省略。
        signed int ---> int 
        unsigned int ---> unsigned
        signed long int ---> signed long
    3.*操作符执行的是间接访问操作(indirection),也译作间接寻址
    4.C语言中有几种声明,它们的类型名可以省略:
        4.1.函数的省缺返回值类型为int类型。
        4.2参数声明的类型名省缺为int类型。

        
第三节 C语言中支持一中叫做typedef的机制,为已有的数据类型起别名。
注意:应使用typedef而不是#define来创建新的类型名。
    typedef p_to_char char *;
    p_to_char a, b;
    正确地声明了a,但是b却被声明为一个字符。
    #define只是简单地符号替换。
    

第四节 常量
    可以使用 const关键字来声明常量
    #define指令也是一种创建名字常量的机制
    
    #define的优势:
        1.只要允许使用字面值常量的地方都可以使用#define;const变量只能用于
        允许使用变量的地方。
        2.使用名字常量定义数组的长度。
    
第五节 作用域:标识符声明的位置决定了它的作用域

编译器可以确认四种不同类型的作用域:
    1.文件作用域
        1.1.任何在所有代码块之外声明的标识符都具有文件作用域
        1.2.从声明之处到源文件结尾都是可以访问的
            局部变量隐藏其作用域除外
            使用#include包含头文件除外
    2.函数作用域
        只适用于语句标签,语句标签用于goto语句。
        可以简化为:一个函数中的所有语句标签必须为一。
        goto语句不能从一个函数调到另外一个函数中。
    3.代码块作用域
        位于一对花括号之间的所有语句称为一个代码块。
        在代码块的开始位置声明的标识符都具有代码块作用域。
    4.原型作用域
        只适用于在函数原型中声明的函数。
        唯一可能出现冲突的就是在同一个原型中,不止一次的使用同一个名字。
    
    
第六节 连接属性(linkage)

一.标识符的连接属性决定:如何处理在不同的文件中出现的标识符。

二.连接属性一共有三种:    
    1.external(外部)
        总被当做同一实体
    2.internal(内部)
        同一源文件中表示同一实体,不同源文件中表示不同实体。
    3.none(无)
        总被当做单独的个体
        
三.作用域与连接属性的关系:
    标识符的作用域与他的连接属性有关,但这两个属性并不相同,标识符的
    位置和连接属性,共同决定了变量的作用域。
    
四.extern 和 static
标识符extern和static用于在声明中修改标识符的链接属性。
    1.每个声明具有external链接属性,加static连接属性变为internal
    
    2.extern为一个标识符指定external链接属性,这只在第一次声明中有效,当它
    用于第二次或者以后的声明时,并不会改变由第一次声明所指定的链接属性。
        static int a;
        {
            extern int i;
        }
    
    3.从技术上说,这两个关键字只有在声明中才是必须的。建议在其他源文件中的
    声明中添加extern关键字。    
    
    
第七节 变量的存储类型:是指变量存储值的内存类型。
    一.关系
        变量的存储类型决定变量:
        1.何时创建
        2.何时销毁
        3.值保存多久
    
    二.存储变量的位置
        1.普通内存
        2.运行时堆栈
        3.硬件寄存器
        
    三.存储类型的分类
        1.自动存储类型(存储类型是自动)
        2.静态存储类型(存储类型是静态)
        3.寄存器存储类型(存储类型是寄存器类型)
    
    变量的位置和声明决定了存储类型。    
    
    四.变量的省缺存储类型取决于它的声明位置:
        1.在代任何码块之外声明的变量:存储于静态内存中,无法指定其他的存储类型。
        称为静态(static)变量,静态变量在程序运行之前创建。
        2.在代码块内部声明的变量:(automatic)省缺存储类型是自动的,称为
        自动(auto)变量。关键字auto就是用于修饰这种存储类型的。
        
    五.关键字对存储类型的影响:
        1.static:对代码块内部声明的变量使用static修饰。
            存储类型从自动变为静态。
        2.extern:对代码块内部声明的变量使用extern修饰。
            存储类型从自动变为静态。
        3.register:关键字register可以用于自动变量的声明,提示它们应该存储
        于硬件寄存器,称为寄存器变量。
            3.1优势:
                寄存器变量比存储于内存中的变量访问起来效率更高。
            3.2机器不提供寄存器变量的地址。    
    
    六.初始化问题:??????????
        静态变量:
            1.不指定初始值,初始化为0。
            2.在程序执行之前创建。
            3.在编译过程中值已经和对应变量名建立关系,存储在data区(全局
                变量中已初始化的数据)。
        自动变量:没有省缺的初始值。
            提供一条隐式的赋值语句使与变量名建立关系。
    
第八节 static关键字
当用于不同的上下文环境时,static关键字具有不同的意思。
    一.用于代码块之外的变量声明或定义函数时:
        1.static关键字用于修改标识符的连接属性,从external改为internal。
        2.但标识符的作用域和存储类型(函数的存储类型本身就是静态的)不受影响。
    二.用于代码块内部的变量声明时:
        1.static关键字用于修改变量的存储类型。
        2.变量的连接属性和作用域不受影响。在程序执行之前创建???
        
        
        
        
        
        
        
        
        
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值