C语言数据
#数据
变量的三个属性—-作用域、链接属性和存储类型。这三个属性决定了一个变量的”可视性”和”生命期”.
##1. 基本数据类型
在C语言中,仅有4种基本数据类型—–整形、浮点型、指针和聚合类型(如数组和结构等)。所有其他类型都是从这四种基本类型的某种组合派生而来。
###1.1 整形家族
整形家族包括字符、短整型、整形和长整形。它们都分为有符号(signed)和无符号(unsigned)两个版本。
长整形至少应该和整形一样长,而整形至少应该和短整型一样长。
变量的最小范围如下表所示:
类型 | 最小范围 |
---|---|
char | 0到127 |
signed char | -127到127 |
unsigned char | 0到255 |
short int | -32767到32767 |
unsigned short int | 0到65535 |
int | -32767到32767 |
unsigned int | 0到65535 |
long int | -2127483647到2127483647 |
unsigned long int | 0到4294967295 |
###1.2 指针
变量的值存储于计算机内存中,每个变量都占据一个特定的位置。每个内存位置都由地址唯一确定并引用,就像一条街道上的房子由它们的门牌号码标识一样。指针只是地址的另一个名字。
###1.3 typedef
c语言支持一种叫做typedef的机制,它允许你为各种数据类型定义新名字。typedef声明的写法和普通的声明基本相同,只是把typedef这个关键字出现在声明的前面。例如,下面这个声明:
char *ptr_to_char;
把变量ptr_to_char声明为一个指向字符的指针。但是,在你添加关键字typedef后,声明变为:
typedef char *ptr_to_char;
这个声明把标示符ptr_to_char作为指向字符的指针类型的新名字。你可以像使用任何预定义名字一样在下面的声明中使用这个新名字。例如:
ptr_to_char a;
声明a是一个指向字符的指针。
使用typedef声明类型可以减少使声明变的又臭又长的危险,尤其是那些复杂的声明。而且,如果你以后觉得应该修改程序所使用的一些数据类型的时候,修改一个typedef声明比修改程序中与这种类型有关的所有变量(和函数)的所有声明要容易得多。
###1.4 常量 ANSI C 允许你声明常量,常量的样子和变量完全一样,只是它们的值不能修改。可以使用const关键字来声明常量,如下面例子所示:
int const a;
const int a; 这两条语句都把a声明为一个整数,它的值不能被修改。当然,由于a的值无法被修改,所以无法把任何东西复制给它。如此一来,怎样才能让它在一开始就拥有一个值呢?有两种方法:首先,可以在声明时对它进行初始化,如下所示:
int const a = 15;
其次,在函数中声明为const的形参在函数被调用时会得到实参的值。
当设计指针变量时,情况变得更加有趣,因为有两样东西有可能成为常量—–指针常量和它所指向的实体。下面是几个声明的例子:
int *pi; pi是一个葡萄糖的指向整形的指针。而变量
int const *pci; 则是一个指向整形常量的指针。你可以修改指针的值,但不能修改它所指向的值。相比之下:
int * const cpi; 则声明一个指向整形的常量指针。此时指针是常量,它的值无法修改,但你可以修改它所指向的整形的值。
int const * const cpci; 最后这个例子中,无论指针本身还是它所指向的值都是常量,不允许修改。
###1.5 作用域
当变量在程序的某个部分被声明时,它只有在程序的一定区域才能被访问。这个区域由标示符的作用域决定。标示符的作用域就是程序中该标示符可以被使用的区域。例如,函数的局部变量的作用域限于该函数的函数体。这个规则意味着两点。首先,其他函数无法通过这些变量的名字访问它们,因为这些变量在它们的作用域之外便不再有效。其次,只要分属不同的作用域,你可以给不同的变量起同一个名字。
编译器可以确认4种不同类型的作用域—–文件作用域、函数作用域、代码块作用域和原型作用域。标示符声明的位置决定它的作用域。