Chinaunix首页 | 论坛 | 博客
  • 博客访问: 152457
  • 博文数量: 36
  • 博客积分: 802
  • 博客等级: 准尉
  • 技术积分: 717
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-02 22:47
文章分类
文章存档

2012年(36)

分类: C/C++

2012-10-12 10:10:00

二:i++与++i
一直一来,只知道i++刚开始改变的是表达式的值,i本身的值不变,只有当表达式执行完毕,i本身才会发生变化,而++i却是刚开始i的值就发生了变化。
这样说并不直观,我们来举例子:
eg:

  1. i=6;
  2. while(i++>6)//这个循环中的i++>6是进不去的 此刻 这个i是6,只有当这句话执行结束后,i才会变为7
  3. {
  4. printf("Hello!\n");
  5. break;
  6. }
  7. while(++i>6)//这个循环中,i在一开始就会自己增加到7.所以会执行printf语句。
  8. {
  9. printf("world!\n");
  10. break;
  11. }
三:sizeof()的用法:
int *p;
sizeof(p)=4;//但sizeof(*p)相当于sizeof(int);      
对于静态数组,sizeof可直接计算数组大小;
  int a[10];char b[]="hello";
  sizeof(a)等于4*10=40;
  sizeof(b)等于6;
 注意数组做型参时,数组名称当作指针使用!!
void  fun(char p[])
{
sizeof(p)//等于4
}    
经典问题: 
      double* (*a)[3][6]; 
      cout< a为指针
      cout< *a为一个有3*6个指针元素的数组
      cout< **a为数组一维的6个指针
      cout< ***a为一维的第一个指针
      cout< ****a为一个double变量

使用sizeof时string的注意事项
   string s="hello";
   sizeof(s)等于string类的大小,sizeof(s.c_str())得到的是与字符串长度。
union 与struct的空间计算
   总体上遵循两个原则:
   (1)整体空间是
占用空间最大的成员(的类型)所占字节数的整倍数
   (2)数据对齐原则----内存按结构成员的先后顺序排列,当排到该成员变量时,其前面已摆放的空间大小必须是该成员类型大小的整倍数,如果不够则补齐,以此向后类推。。。。。
   注意:数组按照单个变量一个一个的摆放,而不是看成整体。如果成员中有自定义的类、结构体,也要注意数组问题。
例:
因为对齐问题使结构体的sizeof变得比较复杂,看下面的例子:(默认对齐方式下)

  1. struct s1
  2. {
  3. char a;
  4. double b;
  5. int c;
  6. char d;
  7. };

  8. struct s2
  9. {
  10. char a;
  11. char b;
  12. int c;
  13. double d;
  14. };
cout<
cout<

同样是两个char类型,一个int类型,一个double类型,但是因为对齐问题,导致他们的大小不同
对于s1,首先把a放到8的对界,假定是0,此时下一个空闲的地址是1,但是下一个元素bdouble类型,要放到8的对界上,离1最接近的地址是8了,所以b被放在了8,此时下一个空闲地址变成了16,下一个元素c的对界是416可以满足,所以c放在了16,此时下一个空闲地址变成了20,下一个元素b需要对界1,也正好落在对界上,所以b放在了20,结构体在地址21处结束。由于s1的大小需要是8的倍数,所以21-23的空间被保留,s1的大小变成了24
 
对于s2,首先把a放到8的对界,假定是0,此时下一个空闲地址是1,下一个元素的对界也是1,所以b摆放在1,下一个空闲地址变成了2;下一个元素c的对界是4,所以取离2最近的地址4摆放c,下一个空闲地址变成了8,下一个元素d的对界是8,所以d摆放在8,所有元素摆放完毕,结构体在15处结束,占用总空间为16,正好是8的倍数。

这里有个陷阱,对于结构体中的结构体成员,不要认为它的对齐方式就是他的大小

  1. struct s1
  2. {
  3. char a[8];
  4. };

  5. struct s2
  6. {
  7. double d;
  8. };

  9. struct s3
  10. {
  11. s1 s;
  12. char a;
  13. };

  14. struct s4
  15. {
  16. s2 s;
  17. char a;
  18. };
cout<
cout<
cout<
cout<
s1
s2大小虽然都是8,但是s1的对齐方式是1s28double),所以在s3s4中才有这样的差异。
所以,在自己定义结构体的时候,如果空间紧张的话,最好考虑对齐因素来排列结构体里的元素。
 
补充:不要让double干扰你的位域
  在结构体和类中,可以使用位域来规定某个成员所能占用的空间,所以使用位域能在一定程度上节省结构体占用的空间。不过考虑下面的代码:

  1. struct s1
  2. {
  3.  int i: 8;
  4.  int j: 4;
  5.  double b;
  6.  int a:3;
  7. };

  8. struct s2
  9. {
  10.  int i;
  11.  int j;
  12.  double b;
  13.  int a;
  14. };

  15. struct s3
  16. {
  17.  int i;
  18.  int j;
  19.  int a;
  20.  double b;
  21. };

  22. struct s4
  23. {
  24.  int i: 8;
  25.  int j: 4;
  26.  int a:3;
  27.  double b;
  28. };
cout< cout< cout< cout<   可以看到,有double存在会干涉到位域(sizeof的算法参考上一节),所以使用位域的的时候,最好把float类型和double类型放在程序的开始或者最后。
四:windows消息队列的机制
(1)窗口消息:指的是由操作系统和控制其他窗口的窗口所使用的消息
(2)命令消息:这是特殊窗口消息,用来处理从一个窗口到另一个窗口的用户请求
(3)空间通知消息:一个窗口内的子空间发生了一些事件,需要通知父窗口


阅读(1870) | 评论(1) | 转发(1) |
0

上一篇:最近笔试总结一

下一篇:最近笔试总结三

给主人留下些什么吧!~~