【C语言深度解剖】阅读笔记 32个关键字

定义:创建了对象,并为对象分配内存

声明:没有分配内存(1.告诉编译器对象已经有内存2.告诉编译器,这个名字已经被预定,不能被其他变量或对象使用

1.auto 声明自动变量,缺省时编译器一般默认为 auto

2.register:这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内 存寻址访问以提高效率。

数据处理路线:内存-寄存器-cpu-寄存器-内存   寄存器相当于小的存储空间,目的是为了提高处理效率

register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度。 而且 register 变量可能不存放在内存中,所以不能用取址运算符“&” 来获取 register 变量的地址

3.static

静态全局变量:作用域在定义文件内使用,并且只能在定义之后使用

静态局部变量:定义以及作用域在函数内

static修饰的变量存储在内存静态区,因此即使函数结束该变量值也不会改变,下次调用函数时还是这个值

函数前加 static 使得函数成为静态函数。对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名

总结:①用来表示函数结束仍然存在的局部变量②用来表示不能被其他文件访问的全局变量与函数(c++中有第三个含义)

4.short、int、long、char、float、double

5.sizeof

sizeof 在 计算变量所占空间大小时,括号可以省略,而计算类型(模子)大小时不能省略。

6.if、else 组合

FLASE 的值在编译器里被定义为 0;但 TRUE 的值Visual C++定义为 1,而 Visual Basic 就把 TRUE 定义为-1

bool 变量与“零值”进行比较的 if 语句:if(bTestFlag); if(!bTestFlag);

float 变量与“零值”进行比较的 if 语句:if((fTestVal >= -EPSINON) && (fTestVal <= EPSINON)); //EPSINON 为定义好的精度,如果一个数落在[0.0-EPSINON,0.0+EPSINON] 这个闭区间内,我们认为在某个精度内它的值与零值相等

指针变量与“零值”进行比较:if(NULL == p); if(NULL != p)

注意代码规范,要把发生概率更大的情况写在前面判断,有利于代码可读性和性能

7、switch、case 组合

每个 case 语句的结尾一定要加 break;即使不需要 default 处理,也应该保留语句:

default :

break;

case 后面只能是整型或字符型的常量或常量表达式(想想字符型数据在内存里是怎么存的)。把 default 子句只用于检查真正的默认情况

8、do、while、for 关键字

在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数

建议 for 语句的循环控制变量的取值采用“半开半闭区间”写法。

9、goto 关键字

禁用 goto 语句。它可能跳过了变量的初始化、重要的计算等语句

10、void 关键字

void 的作用在于: (1) 对函数返回的限定; (2) 对函数参数的限定

任何类型的指针都可以直接赋值给void *

如果函数没有返回值,那么应声明为 void 类型。在 C 语言中,凡不加返回值类型限定的函数,就会被编译器作为返回整型值处理。

如果函数无参数,那么应声明其参数为 void

不能对 void 指针进行算法操作,进行算法操作的指针必须是确定知道其指向数据类型大小的。也就是说必须知道内存目的地址的确切值

函数的参数可以是任意类型指针,那么应声明其参数为 void * 

典型的如内存操作函数 memcpy 和 memset 的函数原型分别为:

void * memcpy(void *dest, const void *src, size_t len);

void * memset ( void * buffer, int c, size_t num );

void 不能定义变量

11、return 关键字

return 语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动销毁。

return; 则返回 undefined

12、const 关键字

编译器通常不为普通 const 只读变量分配存储空间,而是将它们保存在符号表中,这使

得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率也很高。

const 修饰的只读变量,const 修饰的只读变量必须在定义的同时初始化

修饰一般变量和数组时,const和类型说明符的位置可变

修饰指针时:

const int *p; // p 可变,p 指向的对象不可变 int const *p; // p 可变,p 指向的对象不可变 int *const p; // p 不可变,p 指向的对象可变 const int *const p; //指针 p 和 p 指向的对象都不可变

*p表示指向的对象,p是指针,具体看const靠近谁,谁就不可变

const 修饰符也可以修饰函数的参数,void Fun(const int i),告诉编译器i在函数体内不可改变

13、volatile

遇到该关键字编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

14、extern

extern 可以置于变量或者函数前,以 标示变量或者函数的定义在别的文件中

15、struct

将一些相关联的数据打包成一个整体

结构体所占的内存大小是其成员所占内存之和,空结构体的内存大小为1byte

柔性数组:

结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其他成员。柔性数组成员允许结构中包含一个大小可变的数组。sizeof 返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小

struct 与 class 的区别:

在 C++里 struct 关键字与 class 关键字一般可以通用,只有一个很小的区别。struct 的成

员默认情况下属性是 public 的,而 class 成员却是 private 的。结构体内也可以放函数

16、union

union的用法与struct相似,union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有的数据成员具有相同的起始地址。union的空间大小为内部长度最大的数据类型。在 C++里,union 的成员默认属性页为 public。union 主要用来压缩空间。如果一些数据不可能在同一时间同时被用到,则可以使用 union。

大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放

在高地址中。

小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放

在低地址中。

17、enum 关键字

一般的定义方式如下:

enum enum_type_name

{

ENUM_CONST_1,

ENUM_CONST_2,

...

ENUM_CONST_n

} enum_variable_name;

注意:enum_type_name 是自定义的一种数据数据类型名,而 enum_variable_name 为

enum_type_name类型的一个变量,也就是我们平时常说的枚举变量。

enum 变量类型还可以给其中的常量符号赋值,如果不赋值则会从被赋初值的那个常量开始

依次加 1,如果都没有赋值,它们的值从 0 开始依次递增 1。

18、枚举与#define 宏的区别:

1)#define 宏常量是在预编译阶段进行简单替换。枚举常量则是在编译的时候确定其值。

2)一般在编译器里,可以调试枚举常量,但是不能调试宏常量。

3)枚举可以一次定义大量相关的常量,而#define 宏一次只能定义一个。

枚举能做到事,#define 宏能不能都做到?如果能,那为什么还需要枚举?

一方面枚举可以集中管理数据,具有相同属性的整形数据可以使用枚举存放;另外枚举可以实现“取值的自增”(当然也可以指定每个枚举的值),编写代码更容易,减少出错的机会,后续维护时如果需要新增一个信息无需计算该信息取值。

19、typedef

给一个已经存在的数据类型(注意:是类型不是变量)取一个别名

A:typedef与#define不同处

typedef是关键字,具有一种高级数据特性,它能够为已经存在的类型重新命别名(标签)。它的功能与#define相似,但有3个不同之处:

1. 与#define不同,typedef给出的符号仅限于类型,而不是绝对值

2. typedef的解释有编译器,而不是预处理器执行

3. 虽然它的范围有限,但在其受限的范围内。typedef比#define更灵活

B: typedef的使用

  Typedef定义的作用域是取决于定义所在的位置。如果在函数内部,它的作用域是局部的;如果定义在函数外部,它将具有全局作用域。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值