专注c++,看题

本文详细解析了C++中sizeof运算符的行为及其在不同场景下的应用,包括结构体、联合体、空类、虚函数及位域的处理。同时探讨了const与#define的区别、宏的正确使用以及内联函数的特点。

SIZEOF CONST 预处理题目:
1. sizeof相关系列问题
a. struct s{char a;int b};  sizeof(s) = 8;

因为当结构体内元素长度都小于处理器位数(32位=4字节)的时候,便以结构体中最长的数据元素为对齐条件,a 按 1 字节对齐,b 按 4 字节对齐,所以s默认对其参数为8
b. int a[200]; sizeof(a) = 200* sizeof(int) = 800; 对整个数组大小评测
   int* a = new int[200]; sizeof(a) = 4; 对指针大小进行评测
   char str[]="012345"; sizeof(str) = 7; str 是一个字符数组,数组最初大小未定,由具体值"012345"来决定,6*sizeof(char) = 6,还有隐含的"/0",所以一共7位。
   char str[]="s/n";sizeof(str) = 3; 回车"/n" 是一个字符,可以查看ASCII表。还有/r、/t等等字符
c. 这种使用位域的也有,其中元素最大为1字节大小=8 bits,元素按照1字节进行对齐, sizeof(b) = 1 +  1(4 bits+2bits < 8 bits) + 1(3bits) = 3.      
    struct  b
    {
        char a:8;
        char b:4;
        char c:2;
        char d:3;
    };

    写出运行结果:
     union V {
         struct X {
           unsigned char s1:2;
           unsigned char s2:3;
           unsigned char s3:3;
         } x;
         unsigned char c;
    } v;
    v.c = 100;
    printf("%d", v.x.s3);

    100 的2进制是1100100 去掉后面的5位余11放入x.s3中 结果:3
d. 对于空的类进行评测  class A {};  sizeof(A) = 1;默认空类是有一个占位符的
  对于虚函数 class A{ virtual test()}; class B:public A{};sizeof(A)=4;sizeof(B) =4 任何含有虚函数的类拥有一个vptr指针,用来指向虚函数表vtable。sizeof(vptr) = 4
  class A{static int a;}; sizeof(A) = 1; 对于静态成员变量是分配在全局存储区的,所以A还是相当于空类。
  class C:public virtual A {}; sizeof(C)=4; 对于虚拟继承的类拥有虚函数表,所以空类C含有vptr.
e.  设有以下说明和定义:
  typedef union {long i; int k[5]; char c;} DATE; // sizeof(int)*5 = 20
  struct data { int cat; DATE cow; double dog;} too; //4+20+8 = 32
  DATE max;
  则语句 printf("%d",sizeof(struct date)+sizeof(max));的执行结果是:52
  对于union联合来说,取其中最大元素长度来做为联合大小。
f.  使用malloc或者new 分配内存,void *pp  = malloc(10);  sizeof(p) = 4;跟指针一样,sizeof 只能测出静态数组的长度,无法检测动态分配的或外部数组大小
h. 下面函数输出结果:对于char str[100]或者char str[] 参数都退化为char* str,这样的函数即使传入char s[10] 也是可以的
  void Func(char str[100])
  {
      printf("%d/n", sizeof(str));
  }
  char s[10];  //函数对数组长度并没有检验
  Func(s);  
  结果:sizeof(char*)=4
  如何强制str为100位数组? 可以如此声明 char (&str)[100]
  理解顺序:1.str声明为一个引用 2.引用一个100元素数组 3. 数组元素每个为char大小
  void Func(char (&str)[100])
  {
      printf("%d/n", sizeof(str));
  }
  char s[100];
  Func(s);  //这里必须给定100位长度char数组
  结果:100*sizeof(char) = 100
2. CONST 常见题目:
a. const 与 #define有什么不同
答案: 1. const 常量有数据类型,而宏没有数据类型。编译器可以对const 常量进行类型检查,而对宏只进行字符替换没有类型检查。
        2. 有些编译器可以对const常量进行调试,但不能对宏常量进行调试
        3. const 可以用来修饰函数参数、函数返回值,C++还可以用来修饰函数,定义内中某个成员函数为常量函数
3. 写一个标准宏MIN,这个宏输入两个参数并返回较小的一个
答案: #define MIN(A,B) ((A)<=(B) ? (A):(B))
        1. 宏是方便的产生嵌入代码的唯一方法。
        2. 三重条件操作符对编译器来说可以产生比if-then-else更优化的代码。
        3. 必须把宏中的参数用括号括起来
4. 内联函数和宏的差别是什么?
答案: 内联函数和普通函数相比可以加快程序运行的速度,因为不需要中断调用。编译时内联函数代码直接嵌入到目标代码中,而宏只是字符替换。内联函数要做类型检查,相对于宏更安全可靠。
inline只用于如下情况:
         1. 一个函数被不断调用。
         2. 函数只有简单的几行,且函数内不包含for、while、switch等语句.
5. const 符号常量;
(1)const char *p
(2)char const *p
(3)char * const p
说明上面三种描述的区别:
1和2相同,如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量,不能修改指针指向对象的内容
如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量,不能修改指针的指向

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值