读书笔记:c语言深度剖析之关键字

C语言一共有32个关键字
auto 声明自动变量,缺省时一般默认为auto
int   声明整型变量
double 声明双精度变量
long  声明长整型变量
char 声明字符型变量
float 声明浮点型变量
short 声明短整型变量
signed 声明有符号类型变量
unsigned 声明无符号类型变量
struct 声明结构体变量
union 声明联合数据类型
enum 声明枚举类型
static 声明静态变量
switch 用于开关语句
case  开关语句分支
default 开关语句中的其他分支
break 跳出当前循环
register 声明寄存器变量
const 声明只读变量
volatile 说明变量在程序执行中可被隐含地改变
typedef 用于给数据类型取别名
extern 声明变量在其他文件中定义
return 子程序返回语句
void 声明函数无返回值或无参数,声明空类型指针
continue 结束当前循环,开始下一轮循环
do 循环语句的循环体
while 循环语句的循环条件
if 条件语句
else 条件语句否定分支
for 一种循环语句
goto 无条件跳转语句
sizeof 计算对象所占内存空间的大小

   什么是声明:
1、  告诉编译器,这个名字已经匹配到一块内存上;
2、  告诉编译器,这个名字我先预定了,别的地方再也不能用它来作为变量名或对象名;
定义:创建了对象并为对象分配了内存,声明没有分配内存;
   auto 编译器在默认缺省的情况下,所有变量都是auto的;
   register 请求编译器尽可能的将变量存在CPU的内部寄存器中而不是通过内存寻址访问以提高效率;register修饰的变量必须是能被CPU寄存器所接受的类型,这就意味着register修饰的变量必须是一个单个的值,并且其长度应小于或等于整型长度,而且register修饰的变量可能不存放在内存中,所以不能用取地址运算符“&”来获取register修饰的变量的地址;
   static关键字的作用:
1、  修饰变量;变量分为局部变量和全局变量,它们都存在与内存的静态区。静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使使用extern声明也无法使用它。准确的说静态全局变量的作用域是从定义之处开始,到文件尾处结束,在定义之处前面的那些代码行也不能使用它,想要使用就必须在前面做extern声明;静态局部变量,在函数体里面定义,就只能在这个函数里面用,同一个文档中的其他函数也用不了。由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,静态变量的值还是不会被销毁,函数下一次使用时仍然能用到这个值;
2、  修饰函数;函数前面加static使得函数成为静态函数。但此处static的含义不是指存储方式,而是指该函数的作用域仅仅局限于本文件(所以又称内部函数)。使用内部函数的好处:不同的人编写不同的函数时,不用担心自己定义的函数是否会与其他文件中的函数重名
static关键字的两种含义:1、表示退出一个块后仍然存在的局部变量; 2、表示不能被其他文件访问的全局变量和函数;C++赋予了static关键字第3个作用;
   break与contiune
break结束本层循环
continue结束本次循环
   void 空类型
1、  对函数返回的限定;
2、  对函数参数的限定;
void *的特殊性;
其他类型指针不能用void*赋值,void*可以被其他类型指针赋值;
在C语言中,凡是不加返回值类型限定的函数,就会被编译器作为返回整型值处理;
如果函数无形参,那么应声明其参数为void;
ANSI标准规定,不能对void*类型做算法操作;
GNU标准比ANSI标准开放;
void不能代表一个真实的变量
const定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的只读变量在程序运行中只有一份拷贝,而#define定义的宏常量在内存中有若干个拷贝。#define宏是在预编译阶段进行替换,而const修饰的只读变量具有特定的类型;const(类型修饰符)
1、  修饰一般变量
int const i = 2;
const int i = 2;
以上两种语句一样
2、  修饰数组
Int const a[5] = {1 , 2 , 3 , 4 , 5};
const int a[5] = {1 , 2 , 3 , 4 , 5};
以上两种语句一样
3、  修饰指针
const int * p;      //  p可变,p指向的对象不可变
int const * p;      //  p可变,p指向的对象不可变
int * const p;      //  p不可变,p指向的对象可变
const int * const p;    //  p不可变,p指向的对象不可变
‘*’在const后面时表示指针的对象不可变,‘*’在const前面时表示指针不可变
4、  修饰函数的参数
当不希望参数值被函数体内意外改变时使用
5、  修饰函数的返回值
表示函数返回值不可被改变;
C++中对const进行了扩展
   volatile (类型修饰符)
遇到这个关键字声明的变量,编译器对访问该变量的代码不进行优化,从而可以提供对特殊地址的稳定访问;(保证对特殊地址的稳定访问)
   extern 
extern C的用法、
   柔性数组
结构中的最后一个元素允许是未知大小的数组,但结构中的柔性数组成员前面必须至少有一个其他成员,柔性数组成员允许结构中包含一个大小可变的数组。。sizeof 返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
   union
union关键字的用法与struct的用法非常类似,union维护足够的空间来置放多个数据成员的“一种”,而不是位每一个数据成员配置空间,在union中所有的数据成员共用一个空间,同一时间只能存储其中一个数据成员,所有数据成员具有相同的其实地址;
大端模式:字数据的高字节存储在低地址中,而字数据的低字节存储在高地址中;
小端模式:字数据的高字节存储在高地址中,而字数据的低字节存储在低地址中。
union 型数据所占的空间等于其最大的成员所占的空间。对union 型的成员的存取都是相对于该联合体基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union 的首地址位置开始。
   枚举类型
enum Color
{
        Green = 1,
        Red,
        Blue,
        Green_Red = 10,
        Green_Blue
}ColorVal;
enum#define的区别:
1#define宏常量是在预编译阶段进行简单替换。枚举常量则是在编译的时候确定其值;
2、  一般在编译器里,可以调试枚举常量,但不能调试宏常量;
3、  枚举可以一次定义大量的相关常量,而#define宏一次只能定义一个;
enum类型的sizeof计算,由于enum中一次取花括号内任意一个值,而这个值有事int型,因此sizeof所得值即int型的sizeof
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值