C和指针 第三章

本文详细介绍了C语言中的数据类型,包括整型、枚举、浮点型和指针。讨论了整型的长度规范,如short int、long int和int的位宽。枚举类型用于定义符号常量,浮点类型如float、double和long double的存储能力。文章还深入讲解了指针,包括字符串常量的特性以及如何声明和使用指针。最后,提到了变量声明的基本形式、数组声明、const常量的使用以及作用域的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据

整型:

长整型至少应该和整型一样长,而整型至少应该和短整型一样长。
标准没有规定长整型必须比短整型长,只是规定它不得比短整型短。
ANSI标准加入了一个规范:

类型最小范围
char0~127
signed char-127~127
unsigned char0~255
short int-32767~32767
unsigned short int0~65535
int-32767~32767
unsigned int0~65525
long int-2147483647~2147483647
unsigned long int0~4294967295

short int 至少16位,long int至少32位。至于int由编译器设计者决定。

头文件limits.h
说明了各种不同的整数类型的特点
它定义了:
CHAR_BIT:字符型的位数(至少8位)
CHAR_MIN和CHAR_MAX定义了缺省字符类型的范围
MB_LEN_MAX规定了一个多字节字符最多允许的字符数量

signedsignedunsigned
类型最小值最大值最大值
字符SCHAR_MINSCHAR_MAXUCHAR_MAX
短整型SHRT_MINSHRT_MAXUSHRT_MAX
整型INT_MININT_MAXUINT_MAX
长整型LONG_MINLONG_MAXULONG_MAX

关于char的注意点
char本质仍是整数。缺省的char要么是unsigned要么是signed,取决于编译器。因此不同的机器上char可能有不同的范围。正因如此,只有处在unsigned和signed的交集中,这个程序才是可移植的。这就是为什么我们一般用ASCII码的原因。因为ASCII码集中的字符都是位于这个范围的

最佳方案就是把存储于char型变量的值限制在signed char和signed char 的交集内。即使用ASCII码

字面值:
常量和字面值是不一样的。
在整型字面值后面跟L或l,可以是这个整数被解释为long整型值
跟U或u,可以把数值指定为unsigned
如果两个都跟,则被解释为unsigned long
八进制字面值:数值前面以0开头
十六进制字面值:数值以0x开头
当一个字面值用于确定一个字中某些特定位的位置的时候,将它写成十六进制或八进制更为合适。

字符常量,类型总是int。不能在其后跟unsigned或long后缀

枚举类型

enum 名称{ 符号常量};
枚举类型就是指它的值为符号常量而不是字面值的类型。
不要把枚举变量和整数无差别的混合一起使用。

浮点类型

float/double/long double
ANSI标准规定,long double至少和double一样长,double至少和float一样长。
所有浮点类型至少能容纳从10-37~1037之间的任何值。
头文件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类型的值

指针

C语言中没有规定指针常量。

字符串常量

字符串常量可以是空的
就是这样: “”
即使是空字符串,也存在作为终止符的NUL字节

ANSI C声明如果对一个字符串常量进行修改,其效果是未定义的。ANSI编译器不允许修改字符串常量

在程序中使用字符串常量,会生成一个**“指向字符的常量指针”**,当一个字符串常量出现于一个表达式中时,表达式所使用的值就是这些字符所存储的地址,而不是这些字符本身。

基本声明

基本形式:
说明符(一个或多个) 声明表达式列表
说明符:short、long、signed、unsigned

其中 signed一般用于char值,因为其他整形类型在缺省状况下都是有符号数

对于浮点数,除了long double外,其他的说明符,short、signed、unsigned都是不可用的。

声明数组

编译器不检查程序对数组下标的引用是否在数组的合法范围之内。
好处:不需要浪费时间对有些已知是正确的数组下标进行检查。
坏处:这样将使无效的下标引用无法被检测出来

经验法则
如果下标值是从那些已知是正确的值计算出来的,那么就无需检查它的值。如果一个用作下标的值是根据某种方法从用户输入的数据产生而来的,那么在使用它之前必须进行检测,确保它们位于有效的范围之内。

声明指针

注意!!!

int *b,c,d;
//只是声明了一个指针变量b,而c、d都是整型变量
int *b,*c,*d;
//声明了三个指针变量
char *message = "Hello world!!";
//这条语句把message声明为一个指向字符的指针,并用字符串常量中第一个字符的地址对该指针进行初始化
他不是把初始值赋给表达式*message,事实上,他是赋给message的
隐式声明

函数如果不显式地声明返回值的类型,默认返回整型值
等等
最好不要用隐式声明

typedef

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

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

应该使用typedef而不是#define来创建新的类型名。

#define d_ptr_to_char char *
d_ptr_to_char a,b;
//这个只正确声明了a,但是b却被声明为一个字符
//因此,对于#define无法正确处理指针类型
常量

用const声明常量

//谁离const近,谁就不改变
int const *pci;	
//指向整型常量的指针,可以修改指针的值,不可以修改它所指向的值。
int *const cpi;
//指向整型的常量指针。指针是常量,它的值无法修改,但你可以修改它所指向的值
int const *const cpci;
//无论是指针本身还是它所指向的值都是常量,不允许修改

当你声明变量时,如果变量的值不会被修改,应当在声明中使用const关键字。
这样,不仅使你的意图在其他阅读你的程序的人面前得到清晰的表现,而且当这个值被意外修改时,编译器能够发现这个问题。

const只能用于允许使用变量的地方

作用域

文件作用域
函数作用域
代码块作用域
位于一对花括号之间的所有语句称为一个代码块。
任何在代码块的开始位置声明的标识符都具有代码块作用域,表示他们可以被这个代码块中的所有语句访问。
原型作用域

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值