目前在进行C语言补习时,发现很多的同学对于const这个关键字的理解存在很大的误解。现在总结下对这个关键字理解上的误区,希望在以后的编程中,能够灵活使用const这个关键字。
1、 const修饰的变量是常量还是变量
对于这个问题,很多同学认为const修饰的变量是不能改变,结果就误认为该变量变成了常量。那么对于const修饰的变量该如何理解那?
下面我们来看一个例子:
int main
{
char buf[4];
const int a = 0;
a = 10;
}
这个比较容易理解,编译器直接报错,原因在于“a = 10;”这句话,对const修饰的变量,后面进行赋值操作。这好像说明了const修饰的变量是不能被修改的,那究竟是不是那,那么下面我们把这个例子修改下:
int main
{
char buf[4];
const int a = 0;
buf[4] = 97;
printf(“the a is %d\n”,a);
}
其中最后一句printf的目的是看下变量a的值是否改变,根据const的理解,如果const修饰的是变量是不能被修改的话,那么a的值一定不会改变,肯定还是0。但是在实际运行的结果中,我们发现a的值已经变为97了。这说明const修饰的变量a,已经被我们程序修改了。
那综合这两个例子,我们来分析下,对于第二例子,修改的原因是buf[4]的赋值操作,我们知道buf[4]这个变量已经造成了buf这个数组变量的越界访问。buf数组的成员本身只有0,1,2,3,那么buf[4]访问的是谁那,根据局部变量的地址分配,可以知道buf[4]的地址和int a的地址是一样,那么buf[4]实际上就是访问了const int a;那么对buf[4]的修改,自然也修改了const int a的空间,这也是为什么我们在最后打印a的值的时候看到了97这个结果。
那么我们现在可以知道了,const修饰的变量是不具备不允许修改的特性的,那么对于第一个例子的现象我们又如何解释那。
第一个例子,错误是在程序编译的时候给出的,注意这里,这个时候并没有生成可执行文件,说明const修饰的变量可否修改是由编译器来帮我们保护了。而第二个例子里,变量的修改是在可执行程序执行的时候修改的,说明a还是一个变量。
综上所述,我们可以得出一个结论,那就是const修饰的变量,其实质是告诉程序员或编译器该变量为只读,如果程序员在程序中显示的修改一个只读变量,编译器会毫不留情的给出一个error。而对于由于像数组溢出,隐式修改等程序不规范书写造成的运行过程中的修改,编译器是无能为力的,也说明const修饰的变量仍然是具备变量属性的。
2、 被const修饰的变量,会被操作系统保护,防止修改
如果对于第一个问题,有了理解的话,那么这个问题,就非常容易知道答案了。Const修饰的变量是不会被操作系统保护的。
其原因是操作系统只保护常量,而不会保护变量的读写。那么什么是常量?比如“hello world”这个字符串就是被称为字符串常量。
对于这个问题的另一种证明方法,可以看下面这个程序:
int main
{
const int a;
char *buf = “hello world”;
printf(“the &a is %p, the buf is %p\n”,&a, buf);
}
可以发现buf保存的地址是在0x08048000这个地址附近的,而a的地址是在0xbf000000这个地址附近的,而0x08048000附近的地址在我们linux操作系统上是代码段。这也说明了常量和变量是存放在不同区域的,自然操作系统是会保护常量的。
分享到:
相关推荐
8. const修饰符的注意事项:const修饰符不仅能够提高代码的安全性,还能提升性能,因为const常量可以被存储在只读内存区域。然而,const常量实际上并不会被存储在程序的数据段中,而是存储在只读代码段(文本段),...
接下来,我们将通过几个具体的代码片段来进一步理解`const`修饰符的应用场景。 ##### 案例1:基本的`const`修饰符 ```cpp const int a = 10; int b = 20; const int *p; p = &a; cout *p |" ; p = &b; cout *p |...
### C语言中的类型修饰符详解 #### 一、概述 C语言作为一种静态类型的编程语言,提供了多种类型修饰符来帮助开发者更好地控制变量的行为和特性。...理解并恰当地使用这些修饰符,能够显著提高代码的质量和效率。
本文将详细介绍C#中的类修饰符及其使用场景,帮助开发者更好地理解和运用这些修饰符。 #### 类修饰符 - **public**:表示类对外公开,允许任何程序集访问。这是最开放的权限级别,适用于需要跨程序集访问的类。 - ...
在这里,我们将深入探讨C#中的主要修饰符,帮助你全面理解它们的作用和用法。 1. 访问修饰符: - `public`:公共访问修饰符,允许任何代码访问。 - `private`:私有访问修饰符,仅限于在同一个类内部访问。 - `...
C#修饰符 C#语言中,修饰符是用来定义类、方法、属性、字段等成员的访问权限、行为和特性的关键字。...通过学习C#和Java语言中的修饰符,我们可以更好地理解和使用这些关键字,从而编写更加高效、安全、灵活的程序。
在 iOS 开发中,理解这些修饰符的区别非常重要,以便正确地使用它们来确保程序的正确性和安全性。 1. atomic 修饰符 atomic 修饰符是 iOS 中的一种线程保护技术,用于确保多线程环境下的安全性。当使用 atomic ...
本文将深入探讨`const`修饰符在C++中的使用及其相关知识点。 1. `const`修饰的变量 `const`修饰的变量在声明时即被指定为不可更改的值。一旦赋予初始值,就不能再次赋值。这使得它们在程序执行过程中保持不变,有...
三、作为参数和返回值的const修饰符 const不仅可以用来声明变量,还可以用来修饰函数的参数和返回值,以提供额外的保护。 1. 参数的const修饰 函数参数如果被const修饰,那么在函数内部,参数所指向的内容或者...
const限定符可以用于修饰不同的数据类型,包括基本数据类型和指针类型,从而赋予变量不同的保护级别。本文将详细介绍const限定符在C语言中的应用,包括其引入缘由、用法以及如何通过正确使用const限定符来提高程序的...
当const修饰变量时,该变量的值不允许被修改;当const修饰函数参数时,表示在函数内部不会修改该参数的值;当const修饰函数返回值时,表示返回值不可被修改;当const修饰类的成员函数时,表示该成员函数不会修改类的...
- **增强代码可读性**:`const` 声明可以帮助阅读代码的人理解哪些数据是不变的。 - **优化编译器性能**:编译器能够利用 `const` 信息进行更多的优化。 **2. const 的基本用法** - **声明常量**: ```c++ const...
const修饰符用于阻止一个变量被改变。当你想阻止一个变量被改变时,可能会用到const关键字。例如:const int n=5;,这里n是一个const int型的变量,它的值不能被改变。 四、typedef typedef是C/C++中的一种类型...
- 由于 `Var` 是形参,所以这个 `const` 修饰符在这里并无实际意义,因为即使没有这个 `const`,形参也无法修改实参的值。 2. **修饰指针参数**: - `void function(const char *Var);` - 表示 `Var` 指向的内容...
### 关于Const、Const函数与Const变量的理解 在C++编程语言中,`const`关键字是一种类型限定符,被广泛用于提升代码的安全性与可读性。本文将深入探讨`const`的不同用法及其背后的原理。 #### 1. `const`修饰参数 ...
- **指针传递**:当函数参数是通过指针传递时,添加`const`修饰符可以阻止函数内部对该指针所指向的数据进行修改。 ```cpp void StringCopy(char *strDestination, const char *strSource); ``` 在这个例子中...
首先,`const`修饰符用于声明一个函数不会修改对象的状态。当`const`放在函数声明后面的圆括号外时,它修饰的是函数的返回值,表示函数不会改变其返回的对象。而当`const`修饰函数参数或者放在函数定义的末尾时,它...
最后,文档中的代码示例还演示了const限定符的使用错误情况,如尝试修改const修饰的变量或指针,以及const修饰的数组。这些错误会导致编译失败,错误信息提示修改了只读变量,帮助程序员快速定位问题。 通过这些...