C/C++中宏定义和常变量的区别

1. 宏定义

       例如:       #define PI 3.1415926

                         #define Max(a,b) a>b ? a:b

                         int nRel = Max(2,3);

      宏定义简单来说就是替换,名字上面的纯粹复制替代。由于宏在预处理阶段展开,例如上面宏定义PI,程序在该阶段就直接将PI的地方替换成3.1415926,然后执行编译。

      所以宏定义不额外分配内存。

2. 常变量

    C中是没有const定义常变量的概念的,这是C++中的应用。
    例如: const double PI = 3.1415926;
     (注意:常变量在定义时候就必须初始化。这和变量引用是一样的)
    不可以:
                const double PI;
                PI = 3.1415926;    //错误
    const定义常变量与宏定义不同之处,它会在编译阶段执行类型检查。所以常变量定义时一定要表明数据类型。
    const定义常变量也不可以修改其值:
                const int nNum = 10;
                nNum = 100;       //错误,修改常变量存储的数据是不对的。
    另外常变量最常用的地方是,一些函数希望传递过来的形参,不要在该函数内部随意修改数据。这样我们可以将函数形参定义为常变量,禁止函数内部修改。
    例如统计字符串中是否存在空格,只做统计而不修改原字符串。可以声明函数:
    bool GetStringSpace( const char *nzArr , int nLen);

3. 常引用  

   另外,还有一种常引用的应用。如果既要利用引用提高程序效率,又要保护传递给函数的数据不在函数中被修改,就使用常引用。
   例如:
   int nRel;
   const int &nNum = nRel;
   int  &nCon = nRel; 
   nNum = 1; // 错误
   nRel   = 1; //正确
   nCon  =  2; //正确,常规引用也不可以另做其它变量名的别名,但是可以改变引用变量的值。

4. char *const p   char const *p  const char *p的区别

    char *const p :指向char类型的常量指针,p指向的地址不可以修改的,但可以修改其指向变量的值。
    char const *p :指向常变量的指针,指向的常量值不可以修改。
    const char *p :有人说是指向字符的指针,该指针的值不可以修改。其实实际上和char const *p没有区别的,因为const和数据类型放置位置没有前后顺序,所以和char const *p等价。
    虽然char const *p和const char* p等价,但是还是推荐写成const char*,因为为了防止和char *const p的区别,同时也更符合大众读写程序的习惯。
    例如:

    char nzA =1;
    char nzB =2;
    char* const p1 = &nzA;
    *p1 = 1;                             //正确,可以修改常量指针指向变量的值;
    p1 = &nzB;                       //错误,不可以修改p指向的地址。
    *(p1++) =2;                      //错误,也不可以进行地址操作。
    char nzArr[] ={1,2,3};
    char nzArr1[] ={2,3,4};
    char const *p2 =  nzArr;
    const char *p3 =  nzArr;  //char* 可以直接等价于 const char*
     *p2 = "2222";                 //错误,不可以修改常量值
     *p3 = "2222";                 //错误,同上
     p2  = nzArr1;                  //正确,可以修改指针指向的地址
     p3  = nzArr1;                  //正确,同上

     转载请注明出处:CSDN 无鞋童鞋。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值