桂花树生长速度:一些基础常识整理

来源:百度文库 编辑:中财网 时间:2024/05/03 05:35:11
数组:(热门考点之一)
int a[3] = {1,2,3};数组名代表数组第一个元素的地址。注意,它并不是数组的地址(虽然值相同,它们的类型不一样)。a 等价于&a[0]。a+1 等价于 &a[1]。&a是数组的地址。表示数组这个整体的地址。&a+1 就是从a的位置往后便宜一个数组的长度!数组的指针:当从两个结构一致、功能不同的数组中二选一时,往往就需要用数组指针了。int (*ptr)[3] = &a; // 这是数组指针的正确定义方式。
二维数组:它是一个数组,它的每个元素都是一个数组罢了。把上面的套到二维数组上即可。

  float f=9.1;
 int a=(int)f;
 int b=*(int*)&f;问:a b 的值是否相同? 答案是不同的,a是9,b是一个很大的数...a只是简单的类型转换(数学数值的转换),而 *((int*)&f),是将浮点数f的内存存储结构按照int型来解释,由于浮点数在存储的时候需要包括符号部分,指数部分,位数部分,而这些数据在转化成int型来解释时就会变成很大的数字,所以说就出现了上面的结果(很大的一个数)。 
 先转换为同样精度的类型再进行运算和赋值。转换有隐式转换和显式转换,隐式转换是如下这种:
int i;i=3.3+4;
按优先级,表达式先要对3.3和4求和,但是+左边是double,右边是int,它们在内存中是两种完全不同的存储方式,做运算前必做转换,经过将4从int转换到double后,二者再进行求和,得到的就是3.3+4的结果。这个结果7.3(double),要赋给i,仍然要做一次转换,从double到int,小数部分截断后,结果i为7了。 

int i;float a=3.6,b=3.6;i=a+b; 与 i=(int)a+(int)b; 结果分别为7与6 。  C++对显式转换做了区分:   static_cast<转换后的类型>(被转换的对象)
   reinterpret_cast<转换后的类型>(被转换的对象)
C++是种强类型的语言(也是静态类型的语言),也就是说,在很多情况下,一个对象倒底是什么类型,是非常重要的,搞错了会影响程序的正确与否。
--------------------------------------------------------- C++里的类型转换:    static_cast:   一般的转换(如把int转换成char,把int转换成enum),还可以把子类的指针或引用转换成基类表示(这是安全的)。但没有运行时类型检查来保证转换的安全性!   
   dynamic_cast:   通常在基类和派生类之间转换时使用(子类到父类,父类到子类),安全的。把expression_r_r转换成type-id类型的对象,Type-id必须是类的指针、类的引用或者void *;Type-id是指针类型,expression_r_r也必须是指针;Type-id是引用,expression_r_r也是引用。
   const_cast:   主要针对const和volatile的转换。
   reinterpret_cast:   用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数。
格式:static_cast < type-id > ( expression_r_r )      把expression_r_r转换为type-id类型。 ---------------------------------------------------------  基本单位:bit , byte,WORD,DWORD 。(32位系统,64位系统 其实说的是字长为32、64) char占一个机器字节byte,一般是8位(bit)int占4字节,一般是32位(bit)。
long占一个通用寄存器,所以32位机上是32位,64位机上是64位。
指针和long一样大。所以在64位机上占8个字节。
float如果是按照IEEE的标准是32位。
double如果是按照IEEE的标准是64位。
 VC6.0里的定义:
typedef unsigned long       DWORD;   //所以DWORD是4字节

typedef unsigned char       BYTE;  //BYTE是1字节

typedef unsigned short      WORD;  //WORD是2字节

 32位系统中:int 占4字节long (long int)占4字节(64位系统中占8字节)short(short int)占2字节float 占4字节char 占1字节double 占8字节指针 占4字节(64位系统中占8字节)--------------------------------------------------------------------------------------------类型名              变量字节             取值范围
[singned]char           1               -128~127
ungsigned char          1               0~255
[singned] long int      4   -2147483648~2147483647
unsiged long [int]      4            0~4294967295
float                   4  -3.4E38~3.4E38 7个有效位
double                  8 -1.7E308~1.7E308 15个有效位 位操作:
&:按位与;|:按位或;~:按位取反;^:按位异或。相同取0,不同取1。异或主要起一个开关的作用,例如用00100去异或一个玩家的flag 再把结果赋给flag,原flag有了这个标记则会被去掉、原flag没有此标记则会加上。左移<<:右移>>:移出位会被丢弃

实际项目中经常使用16进制数,例如0x1234ffff,一位16进制数表示4位二进制,故8位16进制数表示32位数(例如常见的int、DWORD等),8位二进制数表示一个字节。 ------------------------------------------------------------- 因此,某些时候,explicit 可以有效得防止构造函数的隐式转换带来的错误或者误解

----------------------------------------------------------
explicit   只对构造函数起作用,用来抑制隐式转换。如:  
  class   A   {  
          A(int   a);  
  };  
  int   Function(A   a);  
   
  当调用   Function(2)   的时候,2   会隐式转换为   A   类型。这种情况常常不是程序员想要的结果,所以,要避免之,就可以这样写:  
   
  class   A   {  
          explicit   A(int   a);  
  };  
  int   Function(A   a);  
   
  这样,当调用   Function(2)   的时候,编译器会给出错误信息(除非   Function   有个以   int   为参数的重载形式),这就避免了在程序员毫不知情的情况下出现错误。