C语言深度解剖(第一章-关键字读书笔记)

第一章 关键字

声明和定义最重要的区别是:定义创建了对象并为对象分配了内存,声明没有分配内存(一个抱得美人归,一个坐着喝稀粥(难受))

C语言一共有32个关键字

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

1.2,register 声明寄存器变量:

编译器尽可能的将变量存在CPU内部寄存器中
使用限制:register 变量必须是能被CPU寄存器所接受的类型。意味着register变量必须是一个单个值,并且其长度应小于或等于整形的长度。并且register变量可能不存放在内存中,所以不能用取地址浮“&”来获取register变量地址。因为寄存器寻址方式和内存寻址方式不同

1.3,static:修饰局部和全局变量,但它们都存在内存静态区
静态全局变量:作用域仅限于变量被定义的文件,准确的说在哪里定义直到文件结尾处结束(改变作用域)
静态局部变量:在函数体里定义,只能在本函数使用,即使这个函数运行结束,这个静态变量值还是不会销毁,函数下次使用依然存在(改变声明周期)

static修饰函数使函数成为静态函数(指对函数的作用域仅限于本文件)

1.8.2循环语句的注意点
在多重循环中,如果有可能应当将最长的循环放在最内层,最短的循环放在外层,用来减少CPU跨切循环层的次数
eg:

for(col=0;col<5;col++)
{
    for(row=1;ROW<100;ROW++)
    {
        ...
    }

}
外循环进去一次,内循环执行100for(row=1;ROW<100;ROW++)
{
    for(col=0;col<5;col++)
    {
      ...  
    }

}

外循环进入一次,内循环执行五次,但外循环的切换100

for循环再好采用半开半闭写法,更加直观

1.10 return
return;
这个语句在VS编译器下返回的是:-858993460
在Linux下返回的是:-1077946396

1.11const

1.11.1 const 修饰声明只读变量

const int Max = 10;
int Array[Max];

这条语句在.c文件中是会报错的,因为数组开始定义时就要指定元素的个数,是常量,所以也侧面说明const修饰是变量;
1.11.2节省空间,避免不必要的内存浪费,节省空间

const定义的只读变量在程序运行过程中,它只拷贝了一次(因为它是全局变量的只读,存放在静态区)而#define定义的宏常量在内存中有若干个拷贝,#define在预编译时进行替换,const修饰的只读变量是在编译是确定其值。
1.11.5修饰指针

const int *p//p可变,p指向的对象不可变
int *const p//p不可变,p指向的对象可变
const int *const p  //p不可变,p指向的对象不可变

1.12,最易边的关键字-volatile
volatile 说明变量在程序执行中可被隐含地改变
主要作用是:保证特殊地址稳定的访问,防止被编译器未知的因素修改(比如:操作系统,其它线程,硬件),这样编译器就不会再优化代码了。

问题:const volatile int i=10;这行代码有没有问题?如果没有,那 i 到底是什么属性?

const和volatile放在一起的意义在于: (1)本程序段中不能对a作修改,任何修改都是非法的,或者至少是粗心,编译器应该报错,防止这种粗心; (2)另一个程序段则完全有可能修改,因此编译器最好不要做太过激进的优化(编译器爱优化)。
答:
没问题,const和volatile这两个类型限定符不矛盾。const表示(运行时)常量语义:被const修饰的对象在所在的作用域无法进行修改操作,编译器对于试图直接修改const对象的表达式会产生编译错误。volatile表示“易变的”,即在运行期对象可能在当前程序上下文的控制流以外被修改(例如多线程中被其它线程修改;对象所在的存储器可能被多个硬件设备随机修改等情况):被volatile修饰的对象,编译器不会对这个对象的操作进行优化。一个对象可以同时被const和volatile修饰,表明这个对象体现常量语义,但同时可能被当前对象所在程序上下文以外的情况修改。

1.15,union关键字
union用法和struct用法相似
在union中所有数据成员共用一个空间,同一时间只能存储其中一个数据成员,所有的数据成员具有相同的地址,它的空间容量大小是数据成员中最大的长度

union StateM
{
    char c;
    int n;
    char *str;
    double exp;
};

所有StateM的空间大小就是double数据类型大小
union可以用来确定系统的存储模式(小端模式或大端模式)

#include<stdio.h>

union
{
     int i;
     char c;
 }u;

int main()
{
     u.i = 1;
    if(u.c  == 1)
    {
        printf("小端\n");
    }
    else
    {
        printf("大端\n");
    }
    return 0;
}

1.16,enum 关键字

枚举的成员都是常量,如果没有赋值,默认它们的值都是从0开始依次递增。
eg:

enum Color
{
    GREEN,
    RED,
    BLUE = 3,
    BALCK,
    WHITE = 10,
    PINK

}ColorVal

其中各类常量代表的值分别为:

    GREEN = 0
    RED = 1
    BLUE = 3,
    BALCK = 4
    WHITE = 10
    PINK = 11

问题:计算一下sizeof(ColorVal)大小,为什么呢?
答:计算结果是4,因为枚举变量的大小,实质是常数所占内存空间的大小(常数为int类型,当前主流的编译器中一般是32位机器和64位机器中int型都是4个字节),枚举类型所占内存大小也是一样de

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值