11.读c语言深度剖析 -- auto register static sizeof signed、unsigned

 .1 ,最宽恒大量的关键字----auto

auto:你就当它不存在吧。编译器在默认的缺省情况下,所有变量都是auto的。

 

1.2,最快的关键字---- register

register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中而不是通过内

存寻址访问以提高效率。注意是尽可能,不是绝对。你想想,一个CPU的寄存器也就那么

几个或几十个,你要是定义了很多很多register变量,它累死也可能不能全部把这些变量放

入寄存器吧,轮也可能轮不到你。

1.2.1简讲寄存器

数据从内存里拿出来先放到寄存器,然后CPU再从寄存器里读取数据来处理,处理

完后同样把数据通过寄存器存放到内存里,CPU不直接和内存打交道

一个CPU也可以有很多寄存器,不同型号的CPU拥有寄存器的数量不一样。

寄存器其实就是一块一块小的存储空间,只不过其存取速度要比内存快得多。它离CPU很近,CPU一伸手就拿到数据了,比在那么大的一块内存里去寻找某个地址上的数据是不是快多了?那有人问既然它速度那么快,那我们的内存硬盘都改成寄存器得了呗。我要说的是:你真有钱!

1.2.2,使用register修饰符的注意点

虽然寄存器的速度非常快,但是使用register修饰符也有些限制的:

register变量必须是能被CPU寄存器所接受的类型。意味着register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。

而且register变量可能不存放在内存中,所以不能用取址运算符“&”来获取register变量的地址。

 

 

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

不要误以为关键字static很安静,其实它一点也不安静。这个关键字在C语言里主要有

两个作用,C++对它进行了扩展。

1.3.1,修饰变量

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

静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用extern声明也没法

使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些

代码行也不能使用它。想要使用就得在前面再加extern***。恶心吧?要想不恶心,很简单,

直接在文件顶端定义不就得了。

静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他

函数也用不了。由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结

束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值

1.3.2,修饰函数

第二个作用:修饰函数。函数前加static使得函数成为静态函数。但此处“static”的含义

不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函

数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件

中的函数同名。

1.5,最冤枉的关键字----sizeof

 inti=0(32位系统下测试)

A),sizeof(int)B)sizeof(i)C)sizeof intD)sizeof i

毫无疑问,32位系统下A)B)的值为4。那C)的呢?D)的呢?

通过调试得知D的结果也为4

没有括号居然也行,那想想,函数名后面没有括号行吗?由此轻易得出sizeof绝非函数。

C  sizeof int是神马啊int前面加一个关键字?类型扩展?明显不正确

我们可以在int前加unsignedconst等关键字但不能加sizeof。好,记住:

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

一般情况下咱也别偷懒,乖乖的写上括号,继续装作一个“函数”做一个“披着函数皮的关键字”做我的关键字,让人家认为是函数去吧。

 1.6signedunsigned关键字

 我们知道计算机底层只认识01.任何数据到了底层都会变计算转换成01.那负数怎么

存储呢?肯定这个“-”号是无法存入内存的,怎么办?很好办,做个标记。把基本数据类

型的最高位腾出来,用来存符号,同时约定如下:

最高位如果是1,表明这个数是负数,其值为除最高位以外的剩余位的值添上这个“-”号;

如果最高位是0,表明这个数是正数,其值为除最高位以外的剩余位的值。

这样的话,

 

一个32位的signed int类型整数其值表示法范围为:-2(31)2 (31)-1

8位的char类型数其值表示的范围为-2(7)2 (7)-1

 

一个32位的unsigned int类型整数其值表示法范围为:-2(32)2 (32)-1

8位的char类型数其值表示的范围为-2(8)2 (8)-1

 

同样我们的signed关键字也很宽恒大量,你也可以完全当它不存在,

编译器缺省默认情况下数据为signed类型的。

 ---------------------------------------------------------------------------------------------------------------------

面试题3:sizeof 和strlen 的区别

   sizeof 和strlen 有以下区别:
  sizeof 是一个操作符,strlen 是库函数。

  sizeof 的参数可以是数据的类型,也可以是变量,而strlen 只能以结尾为‘\0‘的字符串作参数。

  编译器在编译时就计算出了sizeof  的结果。而strlen  函数必须在运行时才能计算出来。并且sizeof
   计算的是数据类型占内存的大小,而strlen 计算的是字符串实际的长度。

  数组做sizeof 的参数不退化,传递给strlen 就退化为指针了。

    注意:有些是操作符看起来像是函数,而有些函数名看起来又像操作符,这类容易混淆的名称一定
要加以区分,否则遇到数组名这类特殊数据类型作参数时就很容易出错。最容易混淆为函数的操作符就
是sizeof。

面试题4 :C 语言的关键字static  和 C++  的关键字static  有什么区别

   在C 中static 用来修饰局部静态变量和外部静态变量、函数。而C++中除了上述功能外,还用来定
义类的成员变量和函数。即静态成员和静态成员函数。

    注意:编程时static 的记忆性,和全局性的特点可以让在不同时期调用的函数进行通信,传递信息,
而C++的静态成员则可以在多个对象实例间进行通信,传递信息。

面试题5 :C中的malloc 和C++中的new 有什么区别

   malloc 和new 有以下不同:
    (1)new、delete 是操作符,可以重载,只能在C++中使用。


    (2)malloc、free 是函数,可以覆盖,C、C++中都可以使用。

    (3)new 可以调用对象的构造函数,对应的delete 调用相应的析构函数。
    (4)malloc 仅仅分配内存,free 仅仅回收内存,并不执行构造和析构函数

    (5)new、delete 返回的是某种数据类型指针,malloc、free 返回的是void 指针。
    注意:malloc 申请的内存空间要用free 释放,而new 申请的内存空间要用delete 释放,不要混用。

因为两者实现的机理不同。

面试题6:写一个“标准”宏MIN

   #define min(a,b)((a)<=(b)?(a):(b))

    注意:在调用时一定要注意这个宏定义的副作用,如下调用:
   ((++*p)<=(x)?(++*p):(x)。

   p 指针就自加了两次,违背了MIN 的本意。

面试题7:一个指针可以是volatile 吗

    可以,因为指针和普通变量一样,有时也有变化程序的不可控性。常见例:子中断服务子程序修改

一个指向一个buffer 的指针时,必须用volatile 来修饰这个指针。

    说明:指针是一种普通的变量,从访问上没有什么不同于其他变量的特性。其保存的数值是个整型
数据,和整型变量不同的是,这个整型数据指向的是一段内存地址。

面试题8:a 和&a 有什么区别

    请写出以下代码的打印结果,主要目的是考察a 和&a 的区别。

    #include<stdio.h>
    void main( void )
    {
        int a[5]={1,2,3,4,5};
        int *ptr=(int *)(&a+1);

        printf("%d,%d",*(a+1),*(ptr-1));
        return;
    }

    输出结果:2,5。
    注意:数组名a 可以作数组的首地址,而&a 是数组的指针。思考,将原式的int *ptr=(int *)(&a+1);

改为int *ptr=(int *)(a+1);时输出结果将是什么呢?

 


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值