const深度分析

  

const属于变量属性的一种。使用常量修饰的变量,意味着该变量是一个只读变量,不能随意的修改该变量的值。但并不意味着,通过const的修饰,该变量就变成了常量,本意上并非常量,只是一个只读变量。

  
 <代码> int main () {
  
  const int苹果=1;
  
  苹果=2;//错误
  
  系统(“暂停”);
  返回0;
  } 
  

此时,通过const修饰变量苹果,此时就是只读变量(只读变量)。那么是否,该内存中的值真的无法改变。事实并非如此。我们可以通过声明指针指向该内存空间,通过这个指针,我们是能够修改变量的值的。代码如下:

  
 <代码> int main () {
  
  const int苹果=1;
  int * p=零;
  p=(int *),苹果;
  
  printf(“苹果=% d \ n”,苹果);
  
  * p=2;
  printf(“苹果=% d \ n”,苹果);
  
  系统(“暂停”);
  返回0;
  } 
  

我们通过这个指针变量修改了内存中的值。
当我们通过const来修饰一个全局变量时,它同样是一个只读变量,无法直接修改其值。

  
 <代码> const int glo_apple=3;
  
  int main ()
  {
  glo_apple=4;//错误
  
  系统(“暂停”);
  返回0;
  } 
  

很显然,由于glo_apple是只读变量,在主函数中是无法修改其值的。那么,我们是否可以用同样的方式,声明一个指针指向全局变量,对全局变量glo_apple进行操作呢?

  
 <代码> const int glo_apple=3;
  int main ()
  {
  int * glo_p=(int *), glo_apple;
  
  * p=4;//错误
  printf (" glo_apple=% d \ n”, glo_apple);
  
  系统(“暂停”);
  返回0;
  } 
  

如果将这段代码用现代编译器编译一下,会发现,程序会报错。为什么呢?原因就在于,用常量修饰的全局变量被存放在了“只读存储区”了。用指向全局变量的指针去修改内存中的值肯定会报错。
注意:现代C编译器中的常量将具有全局生命周期的变量存储于只读存储区。(比如静态局部变量也是具有全局生命周期,所以,用常量修饰的静态局部变量也是存储于只读存储区)
注意:由于字符串字面量被存储于只读存储区,也就是说,该值是不希望也不能被改变的,所以需要使用常量来修饰指针变量指向字符串字面量。例如:
const char p=癱hentong";
另外,用常量修饰的函数参数,说明不希望在函数内部修改参数的值。用常量修饰函数返回值,说明函数的返回值不可变,多用于返回指针的类型。比如,有如下代码:

  
 <代码> # include & lt; stdio.h>
  # include & lt; stdlib.h>
  
  const char * f (const int i) {
  我=4;//错误;
  返回“chentong”;
  }
  int main ()
  {
  const int * p=f (2);
  
  printf (" % s \ n, p);
  
  电脑[4]=' o ';//错误
  
  printf (" % s \ n, p);
  
  系统(“暂停”);
  返回0;
  } 
  

首先,函数的参数我不能在函数内部被修改,因为它是一个被const修饰的只读变量。其次,函数的返回值类型是一个常量类型的,也就是意味着,函数返回值不可修改,是个只读变量,因此,在用指针指向这个函数时,需要用常量来修饰该指针。而且,不能通过指针去修改函数的返回值。

const深度分析