您的位置:首页 > 编程语言 > C语言/C++

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

2014-10-29 10:42 357 查看
一 .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本身的值
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: