zoukankan      html  css  js  c++  java
  • 指针常量

    char *string="abc" 中,是将string指向常量"abc",如果执行以下方法会报内存不能为written的错误:

    void change(char *s){

       *s='A';

    }

    解决方法是定义string为字符数组:

    char string[]="abc";

    关于const的具体作用


    A。const最经常的用法

    1.为了防止传递的函数参数不被修改,在调用函数的形参中用const关键字.

    int FindNum(const int array[], int num, int count){

       ...

    }
    编译器会把array[]当作常量数据的数组看待。所以,假如你不小心给数组赋值,那么编译器就会报错了

    2.const可以用来创建数组常量、指针常量、指向常量的指针等:
                 const char ch = 'a';
                 const int a[5] = {1, 2, 3, 4, 5};  
                 const int *p = a;              //a是一个数组的首地址.p是指向常量的指针
                 int * const p = a;             //a是一个数组的首地址.p是指针常量;
                 const int * const p = a;    //a是一个数组的首地址。p是指向常量的指针常量

     ——const int *p = a;       //p是指向常量的指针,因此,不可以通过给指针赋值来改变数组
                                         //中的数据,例如:
                                         // *p = 10;       /*错误*/
                                         // *(p + 2) = 1;  /*错误*/

    ——int * const p = a;      //p是指针常量,我们知道,指针是指向了一个数组的首地址,  

                                         //那么,它的位置就不可以改变了。但可以通过指针改变数组中的数据

                                         //  *p = 2;          /*可以*/
                                         //  *(p+1) = 10;     /*可以*/
                                         //  p++;             /*不可以*/

    B。const并不会阻止参数的修改

    在函数参数中用了const就一定不可以改变是错误的理解,因为,它并不阻止参数的修改,下面举个简单的例子来阐述一下

    int main(void)
    {
        char str[] = "The C programme";

        Change(str);
        printf(str);
                        
        system("Pause");
        return 0;
    }
    void ChangeStr(const char *String)
    {
        char *Source = (char *)String;
        while (*Source)
        {
            *Source = toupper(*Source);
            Source++;
        }
    }

    程序把字符串中的每个字符都转换成大写字母了。因为*String把地址给了*Source,而*Source的值的改变编译器并不干涉,可能有的编译器会发出警告之类。上面的程序只是为了说明const并不会阻止

  • 相关阅读:
    【读书笔记】iOS-简单的数据驱动程序
    数据结构—单链表(类C语言描写叙述)
    使用Hadoop ACL 控制訪问权限
    Iocomp控件之数字显示【图文】
    维护的JSP站点数据丢失
    Simditor用法
    Android实战简易教程-第二十六枪(基于ViewPager实现微信页面切换效果)
    Deferred Rendering(三)反锯齿和半透明问题
    iOS Code Sign error: Provisioning profile can't be found 解决方式
    spring
  • 原文地址:https://www.cnblogs.com/children/p/2347240.html
Copyright © 2011-2022 走看看