指针与const (C++11)

1.cosnt指针

    int age = 39;
    const int * pt = &age;

不可以使用pt改变age的值,即*pt是const,不可修改。

    *pt += 1;      // 非法操作
    cin >> *pt;    // 非法操作

但是,pt的声明并不意味着它指向的变量(age)为const,而仅仅是说不可以使用pt来修改它指向的变量(age)。

    *pt = 20;      // 非法操作
    age = 20;      // ok

2.指向const对象的指针

2.1指向const对象的const指针

    const float g_earth = 9.80;
    const float * pe = &g_earth;   // ok

g_earth 和 pe都为const,都不可以用来修改其所对应的值(9.80)。

2.2指向const对象的非const指针

C++不允许把const地址赋值给非const指针。

    const float g_moon = 1.63;
    float * pm = &g_moon;   // 非法操作

当然,你也可以使用类型转换突破此限制。

3.指向指针的指针

    const int **pp2;
    int *p1;
    const int n = 13;
    pp2 = &p1;      // 非法操作。先假设合法。
    *pp2 = &n;      // ok,两者都是const,但 p1 = &n 非法。
    *p1 = 10;       // 此行的语法是合法的,但不能成功修改n。

因此,把非const地址或指针赋值给const指针的操作只在一次间接地址操作的情况下适用。换句话说,可以把const或者非const的数据赋值给const指针,只要此数据本身不是指针类型。

4.const参数

    const int months[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    ...
    int sum(int arr[], int n);  // 应该是 const int arr[]
    int j = sum(months, 12);    // 非法

上面的函数调用试图把const指针(months)赋值给非const指针(arr),将产生编译错误。

小建议:

只要能够使用const,就使用。建议给指针声明添加const有两个原因:

1.可以防止无意的修改数据;

2.使用const允许函数处理const和非const的实参。如果在函数原型中省略const,则函数只可以接受非const的数据。

只要可以,建议把形参声明为const指针。

时间: 2024-11-09 00:40:16

指针与const (C++11)的相关文章

const与指针修改const对象

我们都知道const对象作用是声明变量为常量,在程序中除非显示转换,否则无法修改. 本文针对显示修改的情况,提醒了一种隐式的错误,以及解决办法. 考虑下面的代码: #include<iostream> int main(){ const int a=0; int *p=const_cast<int*>(&a);//&a返回int *,const_cast<int*>显示转换为int*. *p =1; int b=*p; int c=a; std::cou

C++指针与const

在C++中,const修饰符一般用于修饰常量.常量在定义的时候必须初始化,而且值一旦定义之后就不能修改,这样就能保证常量的值在程序运行过程中不会发生变换. 1.指向const对象的指针 指向const对象的指针本身的指向可以发生变换,但是不可以通过该指针修改所指向变量的值.指向const对象的指针在定义的时候无需初始化,而且这种类型的指针也可以指向普通变量,只不过不能通过该指针修改对应变量的值,即便对应变量不是常量.指向常量的指针在类型标识符前必须有const修饰符修饰,否则编译不通过. 指向c

C++中的指针与const

刚开始接触C++时,指针和const之间的关系有点混乱,现在总结如下: 一.指向const变量的指针 #include<iostream.h> void main() { const int *p=NULL; const int a=10; p=&a; cout<<"*p="<<*p<<endl; int b=100; p=&b; cout<<"*p="<<*p<<e

指向const对象的指针和const指针

const char *p1;/指向const对象的指针 char const *p2;//同上 char *const p3;//const 指针 区别:const后面是什么就限定什么,比如char const *p 就是限定(*p),(*p)就是p指向的那段内存不能变,p的值可以改变,如果是char* const p就是限定p指针的值. 1. 指向const对象的指针,适合做函数形参,保证指向对象不被修改 1.1 p1指向的值不可改变,指向const对象,但是p1可以被修改指向非const对

深入学习 const指针,const引用

指针和引用的区别: 1.指针可以为空,引用不可以为空. 2.指针初始化后可以重新指向新对象,引用初始化以为不可以重新绑定新对象, 3.指针可以在初始化时赋值,可以初始化以后通过赋值运算符(=)赋值:引用只能在初始化时赋值. 4.指针是个实体(占内存4byte),引用只是个别名(不占内存) 5.指针sizeof是4byte,引用sizeof是绑定对象的大小. 6.指针是类型安全,引用是类型安全的. const对于指针和引用的区别: int a = 1: int b = 1: const int *

【c++基础】const、const指针、const引用

一.const常量 声明时必须同时初始化(和“引用”一样) 二.const指针 三.const引用 引用本身和引用的对象都是const对象,可以用字面值来赋给const引用(普通引用则不行) 1 const B=1024; 2 const refB=B; //const变量的声明和初始化 3 4 const int &r=42;//字面值给const赋值 5 int &r2=42;//错 [c++基础]const.const指针.const引用

C++中引用、指针与const之间的爱恨情愁

学过C语言基础的肯定都知道变量和数据类型是再简单不过的知识,然而这个基础中确有几个泥潭,稍有不慎就粉身碎骨--编程受阻,面试被刷.其中一个就是引用.指针和const,以及相互之间剪不断理还乱的关系.今天我们就来理一理. 1.引用是个什么鬼 1.1引用的概念 引用是为对象另外起的一个名字,也就是别名而已.那什么是对象呢?注意这里说的对象和面向对象里的对象不是一回事.这里的对象是内存的一块区域,它具有某种类型,变量是命名了的对象.可以这么认为,引用与对象简单的关系就像姓名和本人.姓名可以多换几个,但

指针和const限定符

指向const对象的指针,例如:const int *pival;pival是以个指向int类型const对象的指针,const限定pival指针所指向的对象类型,而并非pival本身,也就是说,pival并不是const,在定义时不需要对它进行初始化,如果需要,允许给pival重新赋值,使其指向另外一个const对象,但不能通过pival修改所指对象的值. *pival = 10;//error:pival is a plain pointer 把一个const对象的地址赋值给一个普通的.非c

const对象指针与const指针

1.const位于*左侧,则修饰对象:位于*右侧,则修饰指针 2.const仅修饰对象时,const对象的指针本身可以改变,即指针地址可改变(指向其它对象):若const修饰指针时,则指针本身不能被改变,但并不限定所指对象的值 1 i=0; 2 const int *ip=&i;//仅限定对象i 3 int const *ip=&i;//仅限定对象i 4 int *const ip=&i;//仅限定指针ip 5 const int *const ip=&i//既限定对象i,