zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    iOS-MD5加密、SHA1加密
    iOS-AFNetworking参数和多文件同时上传【多文件上传】
    iOS-CocoaPods安装及使用
    Python Queue模块
    Python socket编程
    python select epoll poll的解析
    python redis使用
    python executemany的使用
    python 三层架构说明
    Python isinstance
  • 原文地址:https://www.cnblogs.com/love-lzb/p/6850931.html
Copyright © 2011-2022 走看看