/ 水滴石穿 / C语言数据

C语言数据

2015-01-02 posted in [clang]

#数据

变量的三个属性—-作用域、链接属性和存储类型。这三个属性决定了一个变量的”可视性”和”生命期”.

##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种不同类型的作用域—–文件作用域、函数作用域、代码块作用域和原型作用域。标示符声明的位置决定它的作用域。