《C和指针》第3章 数据

3.1 基本数据类型
3.1.1 整型家族
整型家族包括字符、短整型、整型和长整型,它们都分为有符号(singed)和无符号(unsigned)两种版本。
长整型至少应该和整型一样长,而整型至少应该和短整型一样长。
头文件limits.h说明了各种不同的整数类型的特点。
一、整型字面值
字面值(literal)这个术语是字面值常量的缩写——这是一种实体,指定了自身的值,并且不允许发生改变。
二、枚举类型
枚举(enumerated)类型就是指它的值为常量而不是字面值的类型,她们以下面的这种形式声明:
enum Jar_Type {CUP,PINT,QUART,HALF_GALLON,GALLON};
这条语句声明了一个类型,称为Jar_Type.这种类型的变量按下列方式声明:
enum Jar_Type milk_jug, gas_can, medicine_bottle;

3.1.2 浮点类型
浮点数家族包括float、double和long duoble类型。ANSI标准规定long double至少和double一样长,而double至少和float一样长。
头文件float.h定义了名字FLT_MAX、DBL_MAX和LDBL_MAX,分别表示float、double和long double所能存储的最大值。而FLT_MIN、DBL_MIN和LDBL_MIN则分别表示float、double和long double能够存储的最小值。
浮点数字面值总是写成十进制的形式,它必须有一个小数点或一个指数,也可以两者都有。浮点数字面值在缺省情况下都是double类型的,除非它后面跟一个L或l表示它是一个long double类型的值,或者跟一个F或f表示它是一个float类型的值。
3.1.3 指针
你可以把计算机的内存想象成一条长街的一间间房子,每间房子都用一个唯一的号码进行标识。每个位置包含一个值,这和它的地址是独立且显著不同的,即使它们都是数字。
一、指针常量(pointer constant)
C语言内部并有特地定义这个概念。
二、字符串常量(string literal)
C语言提供了字符串常量。

3.2 基本声明
在声明整形变量时,如果声明中已经至少有了一个其他的说明符,关键字int可以省略。unsigned short int a;等效于 unsigned short a;
3.2.1 初始化
3.2.2 声明简单数组
int values[20];
3.2.3 声明指针
int a;
这条语句表示表达式
a产生的结果类型是int。知道了操作符执行的是间接访问操作以后,我们可以推断a肯定是一个指向int的指针。
警告:
C在本质上是一种自由形式的语言,这很容易诱使你把星号写在靠近类型的一侧,如下所示:
int
a;
这个声明与前面一个声明具有相同的意思,而且看上去更为清楚,a被声明为int的指针。但是,这并不是一个号技巧,原因如下:
int
a,b,c;
并不是声明了三个int的指针,而是一个int的a,两个int的b,c。要声明三个指针的正确形式如下:
int *a,*b,*c;

char message = “Hello world!”;
这条语句把message声明为一个指向字符的指针,并用字符串常量中第1个字符的地址对该指针进行初始化。
警告:
看上去初始值似乎是赋给表达式
message,事实上它是赋给message本身的。相当于:
char *message;
message = “Hello world!”;
3.2.4 隐式声明
如果省略了参数的类型,编译器会默认它们为整型。

3.3 typedf
它允许为各种类型定义新名字。例如:
char *ptr_to_char;
把变量ptr_to_char声明为一个指向字符的指针。
typedef char *ptr_to_char;
这个声明把标识符ptr_to_char作为指向字符的指针类型的新名字。你可以向使用任何预定义名字一样在下面的声明中使用这个新名字。例如:
ptr_to_char a;
声明a是一个指向字符的指针。

3.4 常量
使用const关键字来声明常量,例如:
int const a;
const int a;
这两条语句都把a声明为一个整数,它的值不能被修改。
如何给常量赋值1:
int const a = 15;
2:在函数中声明为const的形参在函数被调用时会得到实参的值。
当涉及到指针变量时,有两样东西可以成为常量——指针变量和它所指向的实体。
int *pi;//pi是一个普通的指向整型的指针。
int const *pci;//一个指向整型常量的指针。可以修改指针的值,但不能修改它所指向的值。
int *const cpi;//pci为一个指向整型的常量指针。指针是常量不可以修改,可以修改它所指向的整型的值。
int const * const cpci;//无论指针本身还是它所指向的值都是常量,不允许修改。

#define MAX_ELEMENTS 50
int const mex_element=50;
只要允许使用字面值常量的地方都可以使用前者,比如声明数组的长度。const变量只能用于允许使用变量的地方。

3.5 作用域(scope)
3.5.1 代码块作用域
位于一对花括号之间的所有语句称为一个代码块。任何在代码块的开始位置声明的标识符都具有代码块作用域(block scope)。
3.5.2 文件作用域
任何在所有代码块之外声明的标识符都具有文件作用域(file scope),它表示这些标识符从它们的声明之处指导它所在的源文件结尾处都是可以访问的。在头文件中编写并通过#include指令包含到其他温进中的声明就好像它们是直接写在那些文件中一样。它们的作用域并不局限于头文件的文件尾。
3.5.3 原型作用域
原型作用域(prototype scope)只适用于在函数原型中声明的参数名。
3.5.4 函数作用域
函数作用域(function scope)只适用于语句标签,语句标签用于goto语句。

3.6 链接属性
标识符的链接属性(linkage)决定如何处理在不同文件中出现的标识符。标识符的作用域与它链接属性有关,但这两个属性并不相同。链接属性一共有3种——external(外部)、internal(内部)和none(无)。
在这里插入图片描述
在缺省情况下,标识符b、c和f的链接属性为external,其余标识符的链接属性则为none。因此,如果另外一个源文件也包含了标识符b的类似声明并调用了函数c,它们实际上访问的是这个源文件所定义的实体。f的链接之所以是external是因为它是个函数名。
关键字extern和static用于在声明中修改标识符的链接属性。如果某个声明在正常情况下具有external链接属性,在它前面加上static关键字可以使它的链接属性变为internal。例如,如果第2个声明如下:
static int b;
那么变量b就将为这个源文件所私有。在其他源文件中,如果也链接到一个叫做b的变量,那么它所引用的就是另一个不同的变量。类似,也可以把函数声明为static,如下:
static int c(int b);
这可以防止它被其他源文件调用。
static只对缺省链接属性为external的声明才有改变链接属性的效果。
extern关键字一般而言,它为一个标识符指定external链接属性。


3.7 存储类型
有三个地方可以用于存储变量:普通内存、运行时堆栈、硬件寄存器。
3.8 static关键字
当它用于函数定义时,或用于代码块之外的变量声明时,static关键字用于修改标识符的链接属性,从external改为internal,但标识符的存储类型和作用域不受影响。用这种方式声明的函数或变量只能在声明它们的源文件中访问。
当它用于代码块内部声明时,static关键字用于修改变量的存储类型,从自动变量修改为静态变量,但变量的链接属性和作用域不受影响。用这种方式声明的变量在程序执行之前创建,并在程序的整个执行期间一直存在,而不是每次在代码块开始执行时创建,在代码块执行完毕后销毁。

3.10 总结

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lanzijingshizi/article/details/83540159
今日推荐