(c/c++学习笔记十二)const详解

一 .const修饰普通变量

    const修饰的变量会转换为一个常量

    例:

int main(int argc, char *argv[])
{
    const int a = 10;   //定义一个常量a
    int const b = 5;    //定义一个常量b    两种方法相等
    const int c;        //error  常量定义时必须初始化
    int d;              //定义一个普通变量d
    a = 11;             //error  尝试修改常量
    b = 6;              //error  尝试修改常量
    d = 1;              //给变量赋值
}

二.指向const对象的指针

    如果指针指向const对象,则不允许用指针来改变其所指向的const值。为了保证这个特性,c++语言要求指向const对象的指针也必须具有const特性。指向const对象的指针在定义时不需要处死哈哈,如果需要的话,允许给指针重新赋值,使其指向另一个const对象,但不能通过指针修改其所指对象的值。

    例:

int main(int argc, char *argv[])
{
    const int *pa;              //定义指向const对象的指针pa,可以不初始化
    int const *pb;              //效果同上
    int *pc;                    //定义普通int型指针
    const int a = 10, b = 20;   //定义const变量 a和b
    pa = &a;                    //给pa赋值
    pa = &b;                    //可以修改pa的值
    *pa = 20;                   //error  不能修改pa指向的值 
    pc = &a;                    //error  指向const对象的指针类型也必须是const类型
}
    例:

int main(int argc, char *argv[])
{
    const int *pa;              //定义指向const对象的指针pa,可以不初始化
    int a = 30;                 //定义普通变量a
    pa = &a;                    //指向const对象的指针可以指向非const对象
    *pa = 10;                   //error 同样不能修改const指针指向的内容
    printf("%d\n",*pa);         //输出30
    a = 10;                     //虽然不能直接修改pa指向的内容,但是由于pa指向的是非const对象,
	                        //可以通过其他方法来修改pa指向的内容	                           
    printf("%d\n",*pa);         //输出10
}

三.const指针

    const指针本身的值不可以修改,但是它指向的内容可以被修改。

    例:

int main(int argc, char *argv[])
{
    int a = 10, b = 20;    //定义普通int型变量a和b
    int* const pa = &a;    //定义const指针pa  const指针必须初始化
    const *int pb = &a;    //error  没有这个形式
    pa = &b;               //error  不能修改pa的值
    *pa = b;               //可以修改pa指向的值
}

四.指向const对象的const指针

    指向const对象的const指针,既不能修改指针指向的内容,也不能修改指针本身的值。

    例:

int main(int argc, char *argv[])
{
    const int a = 10, b = 20;    //定义const变量a和b
    int* const pa = &pa;         //error 指向const对象的指针必须是const类型指针
    const int *const pa = &a;    //定义指向const对象的const指针
    *pa = 20;                    //error 不能修改指针指向的内容
    pa = &b;                     //error 不能修改指针本身的值
}


五.const形参

    函数的形参可以是const类型,函数形参是const类型,在函数内部不能修改参数的值。

    例:

void function(const int i)
{
   i = 20;           //error 不能修改参数的值
}

int main(int argc, char *argv[])
{
    int i = 10;
    function(i);     //如果形参为非引用const类型,实参既可以传const类型,也可以传非const类型
}
    例:

void function(int i)
{
   i = 20;           //可以修改,i是实参的一个副本
}

int main(int argc, char *argv[])
{
    const int i = 10;
    function(i);     //如果形参为非引用普通类型,实参既可以传const类型,也可以传非const类型
}

    例:

void function(const int *i)    //参数为指向const对象的指针
{
    int a = 10;
    *i = 20;       //不能修改实参指向的内容
    i = &a;        //可以修改i本身的值
}


int main(int argc, char *argv[])
{
    int i = 10;
    int *p = &i;
    function(p);   //如果形参为指针或引用const类型,实参既可以传const类型,也可以传非const类型 
}
    例:

void function(int *i)
{
   *i = 20;
}

int main(int argc, char *argv[])
{
    const int i = 10;
    const int *p = &i;
    function(p);   //<span style="font-family: Arial, Helvetica, sans-serif;">如果形参为指针或引用非const类型,实参只能传非const类型</span>

}
    例:

void function(int* const i)    //参数为const指针
{
    int a = 10;
    *i = 10;    //可以修改指针指向的内容
    i = &a;     //error 不可以修改指针的本身的值
}

int main(int argc, char *argv[])
{
    int i = 10;
    int *p = &i;
    function(p);
}


六. const char*和 char* const

    const char* ptr(char const *prt)指针指向的值是常量

    char *const ptr 指针本身的值是常量

    例:

int main(int argc, char *argv[])
{
    char* pa = "aaaa";             
    const char* pb = "bbbb";
    pa = "cccc";     //可以修改指针本身的值
    pb = "cccc";     //<span style="font-family: Arial, Helvetica, sans-serif;">可以修改指针本身的值</span>
    pa[0] = 'd';     //编译通过,运行报错,pa指向的是常量,不能修改pa指向的内容
    pb[0] = 'd';     //编译报错,pb指向的是const型数据
}

    例:

int main(int argc, char *argv[])
{
	char* const pa = "aaaa";;
	pa = "bbbb";  //不能修改pa本身的值
}








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值