《C语言深度剖析》学习笔记

C 语言有32个关键字, sizeof 即为其中一个,而非函数。sizeof   计算对象所占内存空间大小。

什么是定义?什么是声明?它们有何区别?

 

举个例子:

A)int i;

B)extern int i;

 

 

什么是定义:所谓的定义就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是我们经常所说的变量名或对象名但注意,这个名字一旦和这块内存匹配起来,它们就同生共死,并且这块内存的位置也不能被改变。一个变量或对象在一定的区域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器会提示你重复定义同一个变量或对象。

 

 

什么是声明:有两重含义,如下:

第一重含义:告诉编译器,这个名字已经匹配到一块内存上了,下面的代码用到变量或对象是在别的地方定义的。声明可以出现多次。

第二重含义:告诉编译器,我这个名字我先预定了,别的地方再也不能用它来作为变量名或对象名。比如你在图书馆自习室的某个座位上放了一本书,表明这个座位已经有人预订,别人再也不允许使用这个座位。其实这个时候你本人并没有坐在这个座位上。这种声明最典型的例子就是函数参数的声明,例如:

void fun(int i, char c);

我们可以判断:  A)是定义;B)是声明。

最重要的区别:定义创建了对象并为这个对象分配了内存,声明没有分配内存。

 

1.2,最快的关键字---- register
      register:这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内存寻址访问以提高效率。注意是尽可能,不是绝对,因为CPU的寄存器也就那么几个或几十个。

使用register修饰符的注意点:

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

1.3,最名不符实的关键字----static

     不要误以为关键字 static很安静,其实它一点也不安静。这个关键字在 C 语言里主要有两个作用,C++对它进行了扩展。

(1)修饰变量
第一个作用:修饰变量。变量又分为局部和全局变量,但它们都存在内存的静态区。

静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用 extern声明也没法使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。想要使用就得在前面再加 extern *** 或干脆定义在文件顶端。

静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他函数也用不了。由于被 static修饰的变量总是存在于内存的静态区所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。

例:

static int j ;

void fun1(void)
{
     static int i = 0;
     i++;

}
void fun2(void)
{
     j = 0;
     j++;
}
int main()
{
     for(int k=0; k<10; k++)
    {
       fun1();
       fun2();
    }

    return 0;
}

i 和 j的值分别是多少,为什么?

这里,在函数fun1中声明了i,而不是定义了i,也就是告诉编译器,i 这个名字已经匹配到一块内存上了,并且在静态内存区。所以在函数fun1结束后,i的内存区依然存在,保持不变。所以再次调用fun1时,i的值会在上次的基础上再加1。所以上述程序的结果为: i = 10, j = 1;

若将声明i 前的static 关键字去掉,则变成了定义了局部变量i,则最后i 的值为 1。

(2)修饰函数

第二个作用:修饰函数。函数前加 static使得函数成为静态函数但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

关键字 static有着不寻常的历史。起初,在 C 中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static 在 C 中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用 static关键字来表示这第二种含义。

当然,C++里对 static赋予了第三个作用,这里先不讨论,有兴趣的可以找相关资料研究。

1.4,基本数据类型----short、int、 long、char、float、double

1.4.1,数据类型与“模子”

short、int、long、char、float、double这六个关键字代表 C 语言里的六种基本数据类型。它们在内存上咔咔咔,不同大小的内存就分配好了。

      在 32位的系统上 short咔出来的内存大小是2 个byte;int咔出来的内存大小是4个byte; long咔出来的内存大小是4个byte; float咔出来的内存大小是4个byte;double咔出来的内存大小是 8 个byte;char咔出来的内存大小是 1 个 byte。 (注意这里指一般情况,可能不同的平台还会有所不同,具体平台可以用 sizeof关键字测试一下)

1.4.2,变量的命名规则

【规则 1-4】尽量避免名字中出现数字编号,如Value1,Value2 等,除非逻辑上的确需要编号。比如驱动开发时为管脚命名,非编号名字反而不好。初学者总是喜欢用带编号的变量名或函数名,这样子看上去很简单方便,但其实是一颗定时炸弹。这个习惯初学者一定要改过来。

【规则 1-5】对在多个文件之间共同使用的全局变量或函数要加范围限定符(建议使用模块名(缩写)作为范围限定符)。(GUI_ ,etc)

 

标识符的命名规则:

【规则 1-6】标识符名分为两部分:规范标识符前缀(后缀)+ 含义标识 。非全局变量可以不用使用范围限定符前缀。

命名规则

 

【规则 1-7】作用域前缀命名规则。

http://hi.csdn.net/attachment/200912/11/89087_126049674939k9.jpg

【规则 1-8】数据类型前缀命名规则。

http://hi.csdn.net/attachment/200912/11/89087_1260498921m34w.jpg

http://hi.csdn.net/attachment/200912/11/89087_1260498922t2zT.jpg

【规则 1-9】含义标识命名规则,变量命名使用名词性词组,函数命名使用动词性词组。

变量含义标识符构成:目标词 + 动词(的过去分词)+ [状语]+[目的地]:

http://hi.csdn.net/attachment/200912/11/89087_1260499424Nunp.jpg

函数含义标识符构成:动词(一般现时)+目标词+[状语]+[目的地]:

http://hi.csdn.net/attachment/200912/11/89087_126049942500PP.jpg

【规则 1-10】程序中不得出现仅靠大小写区分的相似的标识符。

【规则 1-12】所有宏定义、枚举常数、只读变量全用大写字母命名,用下划线分割单词。

例如:

const int MAX_LENGTH = 100; //这不是常量,而是一个只读变量,具体请往后看

#define FILE_PATH “/usr/tmp”

【规则 1-13】考虑到习惯性问题,局部变量中可采用通用的命名方式,仅限于n、i、j 等作为循环变量使用。

一般来说习惯上用 n,m,i,j,k 等表示int类型的变量;c,ch等表示字符类型变量;a 等表示数组;p 等表示指针。当然这仅仅是一般习惯,除了i,j,k 等可以用来表示循环变量外,别的字符变量名尽量不要使用。

【规则 1-14】定义变量的同时千万千万别忘了初始化。定义变量时编译器并不一定清空了这块内存,它的值可能是无效的数据。

【规则 1-15】不同类型数据之间的运算要注意精度扩展问题,一般低精度数据将向高精度数据扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值