(原+转)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修饰符,包括介绍两个修饰符在 ...
随机推荐
- CAN总线
1.CAN(controller area network) LAN(local area network)局域网 2.CAN等通信协议的开发,使多种LAN通过网关进行数据交换得以实现.如应用在汽车电 ...
- CDZSC_2015寒假新人(2)——数学 C
C - C Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status ...
- python调webservice和COM接口
调webservice # -*- coding: cp936 -*- from suds.client import Client url = 'http://192.168.50.165/port ...
- QT TCP/IP
QT 网络通信(TCP/IP) 服务端: 一.监听新的客户端接入(QTcpServer) 重写函数 incomingConnection(qintptr socketDescriptor) 二.服务端 ...
- 多台服务之间共享Session
一.问题:为了满足足够大的应用,满足更多的客户,就需要架设N台Web服务器(N>=2),在多台Web服务器的情况下,就会涉及到一个问题:用户登陆一台服务器以后,如果在跨越到另一台服务器的时候能够 ...
- chmod 命令——chmod 755与chmod 4755区别(转)
755和4755的区别 chmod是Linux下设置文件权限的命令,后面的数字表示不同用户或用户组的权限. 一般是三个数字:第一个数字表示文件所有者的权限第二个数字表示与文件所有者同属一个用户组的其他 ...
- XHTML 结构化:使用 XHTML 重构网站
http://www.w3school.com.cn/xhtml/xhtml_structural_01.asp 我们曾经为本节撰写的标题是:"XHTML : 简单的规则,容易的方针.&qu ...
- PHP浮点数引起的四舍五入问题
同事在开发中,遇到一个浮点数问题,过来问我,问题如下: $a = 0.705; $b = 20.795; $c = 20.715; $d = 20.745; echo sprintf('%0.2f', ...
- [C++程序设计]返回指针值的函数
定义指针函数的一般形式为 类型名 *函数名(参数表列); 例如 int *a(int x,int y);
- set up size, title to tcl tk main window
#!/usr/bin/wish wm title . "this is main title" wm geometry . 500x300+30+200 500 --width 3 ...