C语言深度解剖

1、定义和声明

定义:创建了对象并且为该对象分配内存并给该对象取上名字(该名字就是变量名或者对象名),注意:名字一旦和这块内存匹配起来,就同生共死,不离不弃,并且这块内存的位置也不能被改变。
声明:没有分配内存,只是告诉编译器,这个名字已经被预定了,别的地方不能再使用它作为变量名和对象名。

extern int a; //声明
int a;  //定义

2、皇帝身边的小太监——寄存器register

这个关键字请求编译器尽可能地将变量存在CPU内部寄存器中,而不是通过“内存寻址访问”,因此可以提高效率。
一个CPU的寄存器数量有限,也就几个或者几十个,因此不可能把所有变量全放入到寄存器。

【举例】

小太监是皇帝和大臣之间数据传递的桥梁。
寄存器是CPU和内存之间数据传递的桥梁。
数据从内存里拿出来先放到CPU内部寄存器,然后CPU再从寄存器里读取数据来处理,CPU处理完数据后同样把数据通过寄存器存放到内存中,CPU不直接和内存打交道。
寄存器其实就是一块一块小的存储空间,只不过存取速度要比内存快得多。

【注意】

因为register变量可能不存放在内存中,所以不能用取址运算符&来获取register变量的地址

3、static在C中的几个含义

(1)修饰变量:
__________________________作用域
static全局变量:从定义之处开始,到文件结尾处结束(限制在定义的文件中,即使使用关键字extern也不能把作用域扩展到别的文件);在定义之处前面的代码行也不能使用它,但是可以用extern扩展到前面的某个代码行处。
static局部变量:在函数体里面定义,就只能在该函数体里使用。
(2)修饰函数
static不是指存储方式,而是对函数的作用域仅局限于本文件,该函数不能被其他文件访问。

4、考点:与“零值”进行比较

bool变量与“零值”进行比较
if(bool == 0)          if(bool == 1)//不好,让人误以为是整型变量
if(bool == FALSE)      if(bool == TRUE)//TRUE的值不一定都是1
if(!bool)              if(bool)   //最好的写法float变量与“零值”进行比较
if(float == 0.0) if(float != 0.0)//不好,没有精度
if((float >= -EPSION)&&(float <= EPSION))//EPSION为定义好的精度,好
③指针变量与“零值”进行比价
if(p == 0)    if(p != 0) //不好,让人误以为是整型变量
if(!p)        if(p)      //不好,让人误以为是bool变量
if(NULL ==p ) if(NULL != p) //好

5、switch

每个case不要忘记加break
switch case禁止使用return语句
case后面只能是整型、字符型、枚举类型。

6、在多层循环中,长的循环的放在内部,短的循环放在外部。
7、void关键字

1】
任何类型的指针都可以赋值给void*,无需进行强制转换;反之不行
void* p1;
int*  p2;
p1 = p2; //正确
p2 = p1; //错误——>修改成 p2 = (int*)p1;2void不能代表一个真实的变量,因为定义变量时必须为其分配内存空间,定义void变量,编译器都不知道该分配多大的内存空间,所以void不能代表一个真实的变量。
void a; //编译错误
function(void a); //编译错误3】几个函数
void memset(void* buffer,int ch,size_t num);
例:
    int array[100];
    memset(array,0,100*sizeof(int)); //将数组array清0

8、return语句注意事项

return语句不可返回指向“栈内存”的“指针”,因为该内存在函数体结束时被自动释放。
例如:
    char* Fun()
    {
        char str[100];
        ... ...
        return str;  //在函数结束后,str会自动释放,导致未知的错误,程序崩溃
    }

9、const修饰只读的变量必须在定义时进行初始化

const int aa; //编译失败,必须初始化
const int aa = 100//编译成功
const#define的区别1const是在编译期间确定值,#define是在预处理阶段2const有类型
(3const在程序运行时只有一个备份,而#define在内存中有若干备份,因此const更加节省空间。

10、柔性数组

1)结构体中的柔性数组成员前面必须至少有一个其他成员
    struct st
    {
        int a;
        char b;
        char ch[]; //等价于char ch[0];
    }
(2)柔性数组不属于sizeof(结构体)的一部分

11、enum枚举类型

enum 枚举类型名称
{
    枚举常量1;
    ... ...
    枚举常量n;
}枚举变量名;

枚举类型和#define的区别1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值