(原+转)C++中的const修饰符
const int a; int const a; 这两个写法是等同的,表示a是一个int常量。
简记:const后面是什么就限定什么(因为C++标准规定,const关键字放在类型或变量名之前等价的)。比如const int *p就是限定(*p),(*p)就是p指向的那段内存不能变,p的值可以改变;如果是int* const p就是限定p指针的值(p指向的对象)。
int a=, b=; //声明变量。
int *p;
p=&a; //声明指针。
*p=;
则const int *p限定(*p),*p不能变,*p=3错误;但是p=&b;可以。
int * const p限定p,p不能变,p=&b错误,但是*p=6;可以。
const修饰指针一共只有三种写法
1. const int *p; 表示p是一个指针,指向const类型的对象(也可以指向非const对象),根本目的在于为了不可以通过p改变p所指对象的值。也可以写成int const* p;含义相同。例如:
int i=,j=;
const int *pi=&i;//这里就是const指针指向非const对象
i=;//ok i是非const 值可以改变
*pi=;//错误pi是指向const对象的指针不可通过它改变指向对象的值
pi=&j;//ok,p是指向const类型的指针,而本身不是const指针,可以改变指向
2. int * const p; 表示p是一个指针常量,常被叫做const指针。这个const可以理解为修饰指针p,就是说p一旦指向某对象就不可以再改变指向了,因此初始化的时候必须固定指向一个int变量,之后就不能再指向别的地方了(其指向对象的值可以更改,但是指向的对象一旦固定,则不能更改)。例如
int i=,j=;
int * const p=&i;//ok定义时初始化
*p=;//ok,p不是指向const对象的指针
p=&j;//错误,因为p已经指向i了不能更改指向了
3. const int * const a;表示a是一个指针常量,初始化的时候必须固定指向一个int常量或者int变量,之后就不能再指向别的地方了,它总是把它所指向的目标当作一个int常量,即:既不能通过p改变指向对象值也不可在p初始化后改变指向。也可以写成int const * const a;含义相同。例如:
int n;
const int * const p3 = &n;
则p3本身的值和所指向的值都不能改变了.也就是说,你既不能写 p3 = &n1,也不能写 *p3 = 100了.
实际编程的情况: int * const p的定义很少去用,用的比较多的是 const char * const msg = "Hello";这样的定义, 用于在C++中,代替C中使用宏来定义常量字串的作用.
const char **是一个指向指针的指针,那个指针又指向一个字符串常量。(?暂不太理解)
char **也是一个指向指针的指针,那个指针又指向一个字符串变量。
对于:int **a;
首先变量a和指针运算符*结合,表明这是一个指针,然后再和第二个*结合表明这个指针指向的是一个指针的地址。因此应将一个指针的地址赋给变量a才是正确的,比如
int b=; int *p=&b; int **a=&p;
再如int *&a;
分析:首先变量a与&运算符结合,表明变量a是一个引用,然后再与*指针运算符结合,表明这个引用引用的是一个指针,因此应将一个指针赋给变量a,比如
int b=; int *p=&b; int *&a=p;
ps,考虑传递形参的时候:
int *p=NULL;
想在change函数中给p分配内存的话,则需要使用指针的指针。如果只使用
void change1(int *point)
{
point =new int [];
}
当函数change1执行完毕后,外面的p依旧是NULL。
使用下面的函数:
void change2(int **point)
{
* point =new int [];
}
则调用完change2后,p分配了内存。change2的形参为指向指针的指针。
后面的说的不太清楚吧,自己也没有理解透彻吧,只知道在函数内部分配内存的话,需要指针的指针。
参考网址:
http://blog.163.com/pei_hua100/blog/static/805697592009550281616/
http://bbs.csdn.net/topics/310124559
(原+转)C++中的const修饰符的更多相关文章
- Delphi 中 函数参数中的 const 修饰符的本质以及注意事项
来自:http://blog.csdn.net/farrellcn/article/details/9096787 ------------------------------------------ ...
- C/C++ 中 const 修饰符用法总结
C/C++ 中 const 修饰符用法总结 在这篇文章中,我总结了一些C/C++语言中的 const 修饰符的常见用法,供大家参考. const 的用法,也是技术性面试中常见的基础问题,希望能够帮大家 ...
- [原创] 基础中的基础(二):C/C++ 中 const 修饰符用法总结
在这篇文章中,我总结了一些C/C++语言中的 const 修饰符的常见用法,供大家参考. const 的用法,也是技术性面试中常见的基础问题,希望能够帮大家梳理一下知识,给大家一点点帮助.作者是菜鸟一 ...
- 转载----C/C++ 中 const 修饰符用法总结
感谢原创作者,写的好详细.不忍错过,所以转载过来了... 原文地址: https://www.cnblogs.com/icemoon1987/p/3320326.html 在这篇文章中,我总结了一些C ...
- C++中 容易忽视的const 修饰符
C++可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多的有点: (1)const常量有数据类型,而宏常量没有数据类型.编译器可以对const进行类型安全检查,而后者只进行 ...
- [.net 面向对象编程基础] (8) 基础中的基础——修饰符
[.net 面向对象编程基础] (8) 基础中的基础——修饰符 在进入C#面向对象核心之前,我们需要先对修饰符有所了解,其实我们在前面说到变量和常量的时候,已经使用了修饰符,并且说明了变量和常量的修改 ...
- [Reprint]C++函数前和函数后加const修饰符区别
c++中关于const的用法有很多,const既可以修饰变量,也可以函数,不同的环境下,是有不同的含义.今天来讲讲const加在函数前和函数后面的区别.比如: 01 #include<iostr ...
- C++函数前和函数后加const修饰符区别
class Test(){ public: Test(){} const int foo(int a); const int foo(int a) const; }; 一.概念 当const在函数名前 ...
- C# 中的sealed修饰符学习
转载原地址 http://developer.51cto.com/art/200908/147327.htm C#语言还是比较常见的东西,这里我们主要介绍C# sealed修饰符,包括介绍两个修饰符在 ...
随机推荐
- CF 13E Holes 【块状链表】
题目描述: 一条直线上n个点,每个点有个“弹力”,可以把当前位置x上面的ball弹到x+a[x]上面. 两种操作 0. 修改a处的弹力值,编程b 1. 询问a点的ball经过多少次能跳出n个点外(就是 ...
- oracle 查询重复数据
SELECT * FROM td_attrval_group WHERE parent_attrval_id IN(SELECT parent_attrval_id FROM td_attrval_g ...
- Fedora19/18/17安装显卡驱动和无限网卡驱动
一.安装nvidia显卡驱动 1. 切换到root用户 su - 2. 确定当前Linux内核及SELinux policy 是否为最新 yum update ke ...
- 10--动作系统(四)动作类中的reverse方法
上一篇文章在使用持续动作过程中遇到不少问题,以获取动作类的反系动作尤为突出.所以今天把动作类找了个遍,先将大部分动作类是否实现reverse方法总结如下: T表示实现F表示没有实现. 观察可以发现带T ...
- 使用SQL脚本访问操作远程数据库
USE [Hik] GO /****** Object: StoredProcedure [dbo].[sp_test] Script Date: 08/21/2015 09:55:21 ****** ...
- php读取和保存base64编码的图片内容
<?php header('Content-type:text/html;charset=utf-8'); //读取图片文件,转换成base64编码格式 $image_file = './429 ...
- python2 ----函数字典的使用
问题背景: 最近在用python2为sublime2写一个插件,其中有一个命令功能,就是输入不同的命令调用不同的函数,但是python不支持switch,只用ifelse的话感觉特别的low而且明显不 ...
- 身份证校验程序(上)- 零基础入门学习Delphi48
身份证校验程序 让编程改变世界 Change the world by program [caption id="attachment_2699" align="alig ...
- CodeForces 25E Test KMP
Description Sometimes it is hard to prepare tests for programming problems. Now Bob is preparing tes ...
- Qt中调用PolarSSL库(一)
最近一直在学习SSL相关的知识,也是先了解理论相关的知识,主要是SSL相关的基本概念和连接建立过程,主要是基于PolarSSL开源库进行学习.学习完了之后就希望能给有所运用,就想用Qt写一个简单的程序 ...