C语言进阶3-数据

3.1 基本数据类型

变量的3个属性:作用域,链接属性,存储类型。

C语言仅含有4种基本数据类型:整形,浮点型,指针,聚合类型(如数组和结构等)。其他类型都是这几种类型的组合派生。

3.1.1 整型家族

1、整数类型 包括:字符,短整型,整形,长整型。它们都有signed和unsigned两种版本。

整形变量的最小范围:

类型 最小范围
char 0~127
signed char -127~127
unsigned char 0~255
short int -32767~32767
unsigned short int 0~65535 (16bit)
int -32767~32767
unsigned int 0~65535
long int -2147483647~2147483647
unsigned long int 0~4294967295 (32bit)

2、枚举类型(enumerated)

enum color { red=8, blue, yellow };

enum color tree1,tree2;

3.1.2 浮点类型 所有浮点类型至少能容纳 10^-37 ~ 10^37之间的任何值。

3.1.3 指针

1、字符串常量(string literal)

当一个字符串常量出现在一个表达式中时,表达式所使用的值就是这些字符所存储的地址。 因此可以把赋值给一个指向字符的指针,但是不能直接将字符串赋值给字符数组。要想赋值,用标准c函数库里的函数如strcpy()。

3.2 基本声明

相等的整形声明:

short |short int |signed sort | signed short int unsigned short | unsigned short int
int |signed int |signed unsigned int | unsigned
long|long int |signed long | signed long int unsigned long int | unsigned long

3.2.1 声明指针

int *a,*b,c;

上式,a,b是指向int的指针,也就是地址。c是整型变量。 * 操作符是间接访问操作(indirection)。

char *message = "hello world!"; 等同于下面的代码: char *message; message = "hello world!";

这里的message是一个指向字符的指针,并用字符串第一个字符的地址给message初始化。

3.3 typedef

为各种数据类型定义新的名字。

typedef char *ptr_char; ptr_char a,b,c;

上式三个a,b,c都是指向字符的指针。

3.4 常量

1、一般常量的初始化:可以在声明变量的时候初始化,或者函数形参const在被调用时会被实参赋值。

2、const声明指针变量时

a.int * const tmp; 可以修改指针的值,不能修改指针所指的值

b.int const *tmp; 与a相反

c.int const* const tmp; 都不可修改

3.5 作用域

1、代码块作用域(block scope):位于一对花括号之间的所有语句。

2、文件作用域(file scope):任何在代码块之外声明的标识符,这是标识符从他们声明处到原文件结尾都是可以访问的。

3、原型作用域(prototype scope):函数原型中声明的参数名(int fun1( int prototype );

4、函数作用域(function scope):语句标签,用于goto语句。

3.6 链接属性

标识符的链接属性由三种:external,internal,none。

代码块之外都是external属性,代码块之内需要加上extern从internal变为external。对整个程序来说都是全局变量。

具有external属性的实体总是具有静态存储类型!

关键字:extern,static。

3.7 存储类型(storage class)

1、普通内存:即非堆栈的内存。凡是在代码块之外定义的都是静态变量,无法再指定其他存储类型,在程序运行之前创建,整个程序运行期间都存在。

2、堆栈:在代码块之内声明的变量的缺省存储类型都是automatic;关键字为auto,但很少用。可以给变量加上static 关键字改变存储类型,但不修改作用域 。形参不能声明为静态变量。

3、寄存器:用于自动变量的声明,提示存储在寄存器中而不是内存。

static关键字 1:当static位于代码块之外时,只修改标识符的链接属性 (external->internal),并不改变存储类型和作用域。2:当它作用于代码块内部时,static只修改变量的存储类型 (auto->static)并不改变链接属性和作用域。

你可能感兴趣的:(C语言,c语言,开发语言,后端)