c/c++中的const关键字
const,c\c++中非常常用的关键字。
首先我们看看const有那些修饰方法。
最前面我们来看一个问题。
char *p = "123";
可能有的人不知道,这里的这个"123"是存储在常量区的,不容许修改的。
也就是说它是个const类型的。
标准的写法应该是
char const *p = "123";
至于为什么编译器容许上面的那个不标准的写法,可能是因为兼容性的问题吧。
char p[4] = "123";//这个和上面的开始大不一样的啊。
切入正题。
const int s = 0;
上面的很容易理解。但带上指针有些同学可能就要昏了。
const int *p = &s;//(1)
int const *p = &s;//(2)
int * const p = &s;//(3)
const int * const p = &s;//(4)
(1)和(2)的效果是一样的,意思是 p 是可变的,但是 p 指向的值是不可变的。
(3)就刚好相反,p 是不可变的,只能指向一个地方,但是 p 指向的值是可变的。
(4)p不可变,*p 也不可变。
我们举个例子看看。
int s = 0;
const int *p = &s;
p++;//可以
p--;//可以
*p = 4;//错误
------------------------------
int s = 0;
int * const p = &s;
*p = 4;//可以
p++;//错误
------------------------------
有的时候我们会使用tpyedef。
typedef char * pStr;
char str[4] = "123";
const char *p1 = str;// p1可变,*p1不可变
const pStr p2 = str;// 和上面的意思不一样哦,p2不可变,*p2可变
p1++;//可以
p2++;//错误
-------------------------------
有时候我们会使用括号
(int *) const p;//p是不可变,*p可变
const (char *) p;//p是不可变,*p可变
-----------------------------------------------------------
在c中 被const修饰的变量并不是正真意义上的常量,而是只读的变量,这和常量还有不少的差距的。
也就是说在内存中开辟一个只读的空间存贮这个变量,如何保证这个空间只读是通过编译器实现的,
当我们能骗过编译器的时候,我们就能就能修改const常量。
在c代码中写:
const int num = 9;
int ary[num];
这段代码是不能通过编译的,如果真的想这么干只能通过宏来实现了。
#define NUM = 9;
int ary[NUM];
大家都知道宏替换的一些弊端,比如:NUM没有类型,从此NUM这个名字再也没有别的用途。
-------------------------------------------------------------
而c++中的const就先进的多了。他是在编译的时候就已经确定了的值。
const int num = 9;
相关文档:
C#和VBScript,ActionScript,C++非常相似!
先在CS中建立一个控制台程序,再打开“Program.cs”。
在 void_Main 输入以下代码:
//这是注释,注释仅在调试时有用
......
今天,在Ubuntu上安装Python遇到了问题: C compiler cannot create executables。这应该是编译环境出现了问题。在网上搜索了一下,解决方法如下:
sudo apt-get install build-essential即可。
......
今天在看 Lippman的《深度探索C++对象模型》,忽然想google一下Lippman与Bjarne Stroustrup的个人关系如何。因为我看BS写的TCPL的前言中从来没有提到过Lippman,是不是Lippman在BS眼中并没有什么地位呢?结果没有查到什么有用的信息,倒是看到孟岩的一篇2004年的博客——《 ......
问题
为什么用C++呢? 在你皱着眉头离开之前,试着回答这个简单的问题。效率,是么?人人都知道这个。但情况是,当一个人开始讨论编程语言或与其相关的话题时,他必须要非常明确而有针对性。为什么呢?我来问你另一个问题:如果效率是人们使用C++的唯一理由,那么为啥不直接用C呢?C被认为比C++效率更高(嗯嗯,我知道C没有 ......