zoukankan      html  css  js  c++  java
  • 第3章 C++中的C

      union节省内存

      使用场合:有时一个程序会使用同一个变量处理不同的数据类型,对于这种情况,有两种选择:可以创建一个struct,其中包含所有
    可能的不同类型的数据;也可以使用联合union,它能把所有的数据放在一个单独的空间内,它计算出放在union中的最大项所必需的空间数,
    来决定union所占用的空间数,使用union可以节省内存。
      注意:每当在union中放置一个值,这个值总在union开始的一个地方,因此我们只需要创建一个能容纳任何一个union变量的
    “超变量”,所有的union变量地址都是一样的(在类或struct中,地址是不同的)。
      例子:

        union Packed { 
            short    j;
            int      k;
            long     l;
            float    f;
            double   d;
        }; 
        
        int main()
        {
            cout << "sizeof(Packed)    : " << sizeof(Packed) << endl 
                << "sizeof(short)      : " << sizeof(short) << endl 
                << "sizeof(int)        : " << sizeof(int) << endl 
                << "sizeof(long)       : " << sizeof(long) << endl 
                << "sizeof(float)      : " << sizeof(float) << endl 
                << "sizeof(double)     : " << sizeof(double) << endl;
        
            cout << endl;
        
            Packed x;
            
            x.d = 3.14159;
            cout << x.d << endl << endl;
            
            cout << "address of(x) : " << hex << &x << endl;
            cout << "address of(j) : " << hex << &x.j << endl;
            cout << "address of(k) : " << hex << &x.k << endl;
            cout << "address of(l) : " << hex << &x.l << endl;
            cout << "address of(f) : " << hex << &x.f << endl;
            cout << "address of(d) : " << hex << &x.d << endl;
            
            getchar();
            return 0;
        }

      运行结果:

      

     

      调试技巧之把变量和表达式转换成字符串

      介绍:在一个预处理器宏中的参数前面加一个#,预处理器会把这个参数转换成一个字符数组。
      例子:

        #define P(A) cout << #A << " : " << (A) << endl;
        
        int main()
        {
            int a = 1,b = 2,c = 3;
            
            P(a); P(b); P(c);
            P(a + b);
            P((c - a) / b);
            
            getchar();
            
            return 0;
        }

      运行结果:

      

      函数指针的定义
        void *(*(*fp1)(int))[10];
        float (*(*fp2)(int,int,float))(int);
        typedef double (*(*(*fp3)())[10])();
        int (*(*fp4())[10])();

      第1行 :fp1是一个指向函数的指针,该函数接受一个整型参数并返回一个指向含有10个void指针数组的指针。
      第2行 :fp2是一个指向函数的指针,该函数接受三个参数且返回一个指向函数的指针,该函数接受一个整型参数并返回一个float。
      第3行 :fp3是一个指向函数的指针,该函数无参数,且返回一个指向含有10个指向函数指针数组的指针,这些函数不接受参数,且返回double值。
      第4行 :不是变量定义而是一个函数定义。fp4是一个返回指针的函数,该指针指向含有10个函数指针的数组,这些函数返回整型值。
      例子:

        #define DF(N) void N() { cout << "Function " #N " called..." << endl; }
    
        DF(a); DF(b); DF(c); DF(d); DF(e); DF(f); DF(g);
    
        void (*func_table[])() = { a,b,c,d,e,f,g };
    
        int main()
        {
            while(1) {
                cout << "press any key from 'a' to 'g' or 'q' to quit" << endl;
    
                char c,cr;
    
                cin.get(c); cin.get(cr);
    
                if(c == 'q') {
                    break;
                } else if(c < 'a' || c > 'g') {
                    continue;
                }
    
                (*func_table[c - 'a'])();
            }
    
            getchar();
    
            return 0;
        }

      运行结果:

      

  • 相关阅读:
    LockFree的栈实现及与加锁实现的性能对比
    redis源码笔记-redis.conf
    【ASP.NET】应用程序、页面和控件的生命周期
    【ASP.NET】HTTP客户请求的数据格式说明
    【ASP.NET】页面间传值
    【ASP.NET】Page.IsPostBack 属性
    【ASP.NET】互联网HTTP连接等出错代码大全
    【经验分享】抽象类、虚函数、接口、多态 概念与关系的理解
    【架构设计】需求分析
    【经验分享】常用正则表达式收集
  • 原文地址:https://www.cnblogs.com/sheshiji/p/3427292.html
Copyright © 2011-2022 走看看