C与指针——数据

3.1基本数据类型

在这里插入图片描述

1.整数类型

长整型(long)至少应该和整型(int)一样长,而整型至少应该和短整型(short)一样长。

整型家族
整型字面值
枚举类型

1. 整型字面值:字面值(literal)为字面值常量的缩写,是一种实体,指定了自身的值,并且不允许发生改变。
2. 枚举类型:枚举(enumerated)类型就是指它的值为符号常量而不是字面值的类型。

头文件limits.h说明了各种不同的整数类型的特点。定义了CHAR_BIT、CHAR_MIN等。

2.浮点类型

头文件float.h定义了名字FLT_MAX、DBL_MAX和LDBL_MAX,分别表示float、double和long double所能存储的最大值。FLT_MIN、DBL_MIN和LDBL_MIN则表示最小值。

浮点数字面值在缺省(默认)情况下都为double类型。

3.指针

指针是地址的另一个名字,指针变量就是其值为另外一个(一些)内存地址的变量。
K&R C: 在字符串常量的存储形式中,所有的字符和NUL终止符都存储于内存的某个位置。因具有相同的值的不同字符串常量在内存中是分开存储的,所以许多编译器都允许程序修改字符串常量。
ANSI C: 声明若对一个字符串常量进行修改,其效果未定义。若需修改字符串,可将其存储于数组中。
在程序中使用字符串常量会产生一个“指向字符的常量指针”。
不可把字符串常量赋值给一个字符数组,因为字符串常量的直接值是一个指针,并非这些字符本身。

3.2 基本声明

1. 变量声明的基本形式

 说明符(一个或多个)                    声明表达式列表

说明符: 包含了一些关键字,用于描述被声明的标识符的基本类型。
声明表达式列表:被声明的标识符的列表。

typedef:

char  *ptr_to_char;   //把变量ptr_to_char声明为一个指向字符的指针
typedef  char  *ptr_to_char; //把标识符ptr_to_char作为指向字符的指针类型的新名字
ptr_to_char a;   //声明a是一个指向字符的指针

在指针中使用typedef优于#define
2. 常量

int const a;  
const int a;//均将a声明为一个整数

int  *pi;  // pi是一个普通的指向整型的指针
int  const  *pci;//是一个指向整型常量的指针。可修改指针的值,不可修改它所指向的值
int  *const  pci; //声明pci为一个指向整型的常量指针。指针为常量,其值不可修改,可修改其所指向的整型的值
int const *const cpci;  //指针本身与其所指向的值均为常量,不允许修改

创建名字常量:

#define  MAX_ELEMENTS  50   //允许使用字面值常量的地方均可使用 √
int  const  max_elements=50;   //const常量只能用于允许使用变量的地方

3.3 作用域(scope)

在这里插入图片描述
代码块作用域: 任何在代码块开始位置声明的标识符都具有代码块作用域。(位于一堆花括号之间的所有语句成为一个代码块)
文件作用域: 在所有代码块之外声明的标识符都具有文件作用域。表示从声明之处到所在原文件结尾均可访问。缺省为external链接属性。
原型作用域: 只适用于在函数原型中声明的参数名。
函数作用域: 只适用于语句标签,语句标签用于goto语句。(一个函数中的所有语句标签必须唯一)

3.4 链接属性(linkage)

在这里插入图片描述
标识符的链接属性决定如何处理在不同文件中出现的标识符。
none:该标识符的多个声明被当作独立不同的实体。
internal:该标识符在同一个源文件中的所有声明都指同一个实体,但位于不同源文件的多个声明则分属不同的实体。
external:该属性的标识符不论声明多少次,不论位于几个源文件,都表示同一个实体。具有该链接属性的实体总是具有静态存储类型。
EX:

typedef char *a;
int b;
int c(int d)
{  int e;
   int f(int g);
   ...
}
//b,c,f的链接属性为external,其余标识符的链接属性则为none

关键字extern和static用于在声明中修改标识符的链接属性。
static:若某个声明在正常情况下具有external链接属性,在它前面加上static关键字可使它的链接属性变为internal。且static只对缺省链接属性为external的声明才有改变链接属性的效果。
entern:当该关键字用于源文件中一个标识符的第1次声明时,它指定该标识符具有external链接属性,若用于该标识符的第2次或以后的声明时,则不会更改由第1次声明所指定的链接属性。

3.5 存储类型(storage class)

变量的存储类型是指存储变量值的内存类型。
在这里插入图片描述
静态变量:在任何代码块之外声明的变量,总存储于静态内存中(不属于堆栈的内存)。静态(static)变量在程序运行之前创建,在程序整个执行期间始终存在。若非赋不同的值或程序结束,则其值不变。缺省初始值为0.

自动变量:在代码块内部声明的变量,存储于堆栈中。代码块中的变量在缺省情况下便为自动(auto)变量。该变量在代码执行完毕后就消失。若给在代码块内部声明的变量加上关键字static,可使它的存储类型从自动变为静态。
因实参总在堆栈中传递给函数,所以函数的形参不可声明为静态。
无缺省初始值(因函数的局部变量在函数的每次调用中可能占据不同位置)。

寄存器变量:关键字register可用于自动变量的声明,提示它们应该存储于机器的硬件存储器而不是内存中,这类变量称为寄存器变量。初始值时垃圾。
若将使用频率高的变量声明为寄存器变量,则可以提高程序的效率。

注:static关键字
用于函数定义或代码块之外的变量声明时——修改标识符的链接属性。
(external—>internal) 只可在声明它们的源文件中使用。
用于代码块内部的变量声明时——修改变量的存储类型。
(自动变量—>静态变量)

全局变量 在程序开始执行之前创建,且在程序整个执行过程中始终存在。
局部变量(从属于函数)在函数开始执行时创建,在函数执行完毕后销毁。仅由函数内部使用过,不可被其他函数通过名字引用。缺省时的存储类型为自动。

作用域、链接属性和存储类型总结

变量类型声明的位置是否存于堆栈作用域如果声明为static
全局所有代码块之外从声明处到文件尾不允许从其他源文件访问
局部代码块起始处整个代码块变量不存储于堆栈中,它的值在程序整个执行期一直保持
形式参数函数头部整个函数不允许

变量的三个属性为:作用域、链接属性和存储类型

这篇博客只是简单的汇总了关于数据与变量的一些基本知识点
Emmm课后也没有编程练习
那就 下一章节见啦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值