数据
变量的三个属性: 作用域,链接属性和存储类型:这个三个属性决定了,变量的可视性,和作用域;
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;// 指向整型的常量指针, 指针是常量,指针指向的地址无法修改,但是可以修改它所指向的整型的值,