C语言中const关键相关问题

1、const修饰的变量

    const修饰的变量是不能通过变量再次赋值而改变。 

1 int main{
2        char buf[4];
3        const int a = 0;  //a不可改变
4       a = 10;          //error 
5 } 
View Code

  这个比较容易理解,编译器直接报错,原因在于“a = 10;”这句话,对const修饰的变量,后面进行赋值操作。

 

int main{
    char buf[4] = {0};
    const int a = 0;
    buf[4] = 97;   //越界操作
    printf(“the a is %d
”,a);
}

 

  如果const修饰的是变量是不能被修改的话,那么a的值一定不会改变,肯定还是0。但是在实际运行的结果中,我们发现a的值已经变为97了。这说明const修饰的变量a,已经被我们程序修改了。

  第一个例子,错误是在程序编译的时候给出的,注意这里,这个时候并没有生成可执行文件,说明const修饰的变量可否修改是由编译器来帮我们保护了。而第二个例子里,变量的修改是在可执行程序执行的时候修改的,说明a还是一个变量。const修饰的变量,其实质是告诉程序员或编译器该变量为只读,如果程序员在程序中显示的修改一个只读变量,编译器会毫不留情的给出一个error。而对于由于像数组溢出,隐式修改等程序不规范书写造成的运行过程中的修改,编译器是无能为力的,也说明const修饰的变量仍然是具备变量属性的。

  综上说明,const修饰变量没有改变变量代表的存储区本身的属性,只是从编译器层面进行了优化,被const修饰的变量不是常量。

    另外const也不会修改变量的生命周期和作用于。

2、const修饰的几种形式 

const int a = 5;  <==>  int const a = 5;
const int *p = &i;  //const修饰的对象为*p,即变量i不可变,p可变
const (int*) p = &i; //const修饰的对象为p,p只能指向变量i的存储区,i可变
int * const p = &i;   //同上
------------------------------------------------------------------
typedef int * p_int;
const p_int p = &i;  //此时const修饰的是p,p不可变,i可变 

3、修改const修饰的变量的值

1)修改只读常量
#include <stdio.h>
int main(void){
      const i = 5;
      int *p = (int *)&i;
      *p = 6;
       printf("%d
", i);      
      return 0;  
}
2)修改指针常量
#include <stdio.h>
int main(void){
      i = 5; 
      const int *p = &i;
      int *q = p;
      *q = 6;
      printf("%d
", *p);      
      return 0;  
}
3)修改常量指针
#include <stdio.h>
int main(void){
      int i = 5; 
      int j = 6;  
      const int *p = &i;
      printf("%p
", p); 
      int **q = (int **)&p;
      *q = &j;
       printf("%p
", p);      
      return 0;  
}

 4、编译器对对const修饰的变量进行优化

#include<iostream>
using namespace std;
int main(void){
    const int a=10;
    const int * p=&a;                    //让指针p指向常量a所在的内存
    int * pa=const_cast<int *>(p);         //强制转换const指针为非const
    *p_var=20;                //往该指针所指向的内存写20,也就是把10给覆盖了
    
    cout << "a=" << a << endl;
    cout << "&a=" <<&a <<endl;
    
    cout << "*p=" <<*p << endl;
    cout << "p=" << p << endl;
    
    cout << "*pa" << *pa<< endl;
    cout << "pa=" << pa << endl;
  
    return 0;
}

 http://www.cnblogs.com/TaigaCon/archive/2012/12/19/2824355.html

原文地址:https://www.cnblogs.com/love-lzb/p/6850931.html