C和指针 学习笔记——第三章 数据

笔记内容: 这不是一个教案,它是一个对本书中笔者认为重要内容的摘抄与总结。

笔记目的:通过写博客来加深自己对书中知识的记忆和理解。

希望通过博客笔记来,来暴露自己或者大家共同存在的问题(PS:强烈希望各位朋友对笔记内容进行批判和补充,我将会把大家的观点不断更新到文章中)。

自我简介:刚入职场的小菜鸟。

C和指针 学习笔记——第三章 数据

C语言中4种基本数据类型:

整型、浮点型、指针、和聚合类型(如数组和结构体等),所有其他类型都是从这4个基本类型的某种组合派生而来。

整型包括 :

字符,短整型,整型和长整型,它们都分为有符号和无符号两种版本。

规定整型值相互间大小的规则很简单:

长整型至少应该和整型一样长,而整型至少应该和短整型一样长。

如果某种机器的环境的字长是32位,而且没有什么指令能够更有效的处理更短的整型值,它可能把这3个整型值都设定为32位。

缺省:

至于int ,char 的缺省值究竟是几位,是由编译器设计者决定,通常这个选择的缺省值是这个机器最为自然(高效)的位数。

移值性的问题:

就那char类型变量来看,因为缺省性问题,也就意味着,不同的机器上char可能是signed 要么是 unsigned ,那它们就拥有不同范围的值,所以当程序使用的char型变量位于signed char和 unsignd char 的 交集中,这个程序才是可移植的。

那是不是把char 显式声明为signed 或unsignd就一个好呢,虽然这样申明可以确保不同机器中 字符是否为有符号保持一致,但有些机器在处理signed 时更加得心应手,如果硬转化为 unsigned ,效率可能受损,所以 把char统一申明为 signed 或unsigned 未必是上上之策,同时,许多处理字符的库函数把他们的参数申明为char,如果你显示申明为signed 或 unsigned ,可能会带来 兼容性的问题。

所以当可移植性问题比较重要时,字符是否为有符号数就会带来两难的境地。最佳妥协方案就是把存储于char 型变量的值限制在signed char 和 unsigned char 交集内,这样可以获得最大程度的可移植性,同时又不牺牲效率。

注意:只有当char 型变量显式声明为signed 或unsigned时,才对他执行算术运算。

enum {CUP, PINT, QUART, HALF_GALLON, GALLON} MILK_JUG, GAS_CAN, MEDICINE_BOTTLE;
1,枚举类型就是指它的值为符号常量而不是字面值的类型
2, 这种类型的变量实际上以整型的方式存储,这些符号名的实际值都是整型值,这里的 CUP 就我0 ,PINT 就为1,以此类推。
注意: enum jar_type { CUP = 0 , PINT = 16 , QUART };
只对部分符号名用这种方式进行赋值是合法的,如果某个符号名未显式指定一个值,那么他的值就比前面一个符号名的值大1 ,这里的 QUART 就应该是 17 而不是 3.

 
 
int *b, c, d; c和d 是整型变量,而不是指针变量。 应该这样定义 int *b,*c, *d ;

int const *pci;
一个指向整型常量的指针,你可以修改指针的值,但是不能修改它所指向的值。

int * const pci;
一个指向整形的常用指针,你不能修改指针的值,但是能修改它所指向的值。


作用域

代码块的作用域:位于一对花括号之间的所有语句称为一个代码块
如果代码块有嵌套,如果内层代码块有一个标示符的名字和外层代码块的一个标示符同名,内层的那个标示符就将隐藏外层的标示符——外层的那个标示符无法在内层代码块中通过名字访问
提示:应该避免在嵌套的代码块中出现相同的变量名。没有很好的理由使用这种技巧,可以引起程序调试和维护期间一起混淆。

因为2个代码块的变量不可能同时存在,所以编译器可以把他们存储于用一个内存地址。

函数的形参的作用域开始于声明出,位于函数体之外。如果在函数体内部声明了名字与形参相同的局部变量,它们就将隐藏形参。这样形参就不能被函数的任何部分访问


链接属性

extern 关键字用于源文件中一个标示符的第一次声明时,如果有第二次以后的声明,它并不会修改由第一次声明所指定的链接属性。
例如 static int i; ....... extern int i ;并不会修改static的 属性。



存储类型

有三个地方可以用于存储变量: 普通内存, 运行时堆栈, 硬件寄存器
1,凡是在任何代码块之外声明的变量总是存储于静态内存中,不属于堆栈的内存,这类变量称为静态变量。
2,代码块内部声明的变量的缺省存储内省是自动的,也就是说它存储于堆栈中。
3,具有静态存储类型的变量在整个程序执行过程中一直存在,修改变量的存储类型,并不表示修改变量的作用域。
4,通常寄存器变量比存储于内存的变量访问起来效率更高,有些编译器可以决定哪些变量存储于寄存器中比人脑的决定更为合理一点。


初始化

静态变量的初始化:如果不显式地指定其初始值,静态变量的初始化为 0;
自动变量:由于初始化在运行时执行,你可以用任何表达式作为初始化值。

除非你对自动变量进行显示的初始化,否则当自动变量创建时,他们的值总是垃圾。

 

你可能感兴趣的:(C/C++)