C++指针与const

  在C++中,const修饰符一般用于修饰常量。常量在定义的时候必须初始化,而且值一旦定义之后就不能修改,这样就能保证常量的值在程序运行过程中不会发生变换。

1.指向const对象的指针

  指向const对象的指针本身的指向可以发生变换,但是不可以通过该指针修改所指向变量的值。指向const对象的指针在定义的时候无需初始化,而且这种类型的指针也可以指向普通变量,只不过不能通过该指针修改对应变量的值,即便对应变量不是常量。指向常量的指针在类型标识符前必须有const修饰符修饰,否则编译不通过。

  指向const对象的指针的定义与用法如下所示:

const int a=1;
int b=1; 

//指向常量的指针在定义时无需初始化
const int *cptr;
//将const放在类型前面或者后面,二者的意义完全相同
int const *cptr;

int *ptr;
cptr= &a;

*cptr =2 ;
//非法,不能通过该指针修改指向变量的值

cptr =&b;
//非法,不能通过该指针修改指向变量的值,即便指向的变量不是常量

ptr =&b;
*ptr=3;
//合法!

ptr =&a;
//非法,指向常量的指针强制要求在类型标识符前使用const修饰符,否则编译不通过

2.const 指针

  const指针本身是常量,其值必须在定义时初始化,且const指针指向的地址在初始化之后无法修改。const指针不能指向常量(除非是指向const对象的const指针),但是可以通过const指针修改其指向的变量的值。

  const指针的定义及用法如下所示:

int a=1;
const int b=2;

int *const cptr;
//非法,const指针在定义时就要初始化

int *count cptr=&b;
//非法,const指针不能指向const对象,除非该指针是指向const对象的const指针

int * const cptr =&a;
*a=2;
//可以通过const指针修改其指向的变量的值

3.指向const对象的const指针

  指向const对象的const指针同时具有1和2中指针的属性。首先不能通过该指针改变其指向对象的值,即便其指向的对象是常量(还是可以指向一般变量的,只是不能通过该指针修改指向的变量的值);另外该指针的值一旦初始化,之后不能修改,而且该指针的值必须在定义时初始化。

  指向const对象的const指针的定义及使用如下所示:

const int a =1;
int b=2;

const int * const cptr;
//非法,必须在定义时初始化

const int * cosnt cptr =&a;
int const * const cptr =&a;
//上述两种顺序的定义意义完全一致

const int * const cptr_1 =&b;
//可以指向一般变量

*cptr_1 =1;
//非法,不能通过该指针改变其指向的对象的值,即便指向的对象不是常量

*cptr=2;
//非法,不能通过该指针改变其指向的对象的值

 

附录:指针和typedef

  设使用typedef定义了下述数据类型:

typedef string * pstring;
const pstring cstr;
pstring const cstr1;

  那么cstr和cstr1真实的数据类型是什么?此时需要认识到const修饰的是pstring的类型,这是一个指针,所以const是直接修饰指针的!因而cstr和cstr1的数据类型都是——

string * const ptr;

参考:C++ Primer 3rd

 

时间: 2024-11-05 00:41:11

C++指针与const的相关文章

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之间的关系有点混乱,现在总结如下: 一.指向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 (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限定符

指向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,