C语言 const 关键字

Const Qualifier in C

The qualifier const can be applied to the declaration of any variable to specify that its value will not be changed ( Which depends upon where const variables are stored, we may change the value of const variable by using pointer ). The result is implementation-defined if an attempt is made to change a const.
1) Pointer to variable.

 

int *ptr;

We can change the value of ptr and we can also change the value of object ptr pointing to. Pointer and value pointed by pointer both are stored in the read-write area. See the following code fragment.

 

#include <stdio.h>

int main(void)

{

    int i = 10;

    int j = 20;

    int *ptr = &i;

    /* pointer to integer */

    printf("*ptr: %d\n", *ptr);

   

    /* pointer is pointing to another variable */

    ptr = &j;

    printf("*ptr: %d\n", *ptr);

   

    /* we can change value stored by pointer */

    *ptr = 100;

    printf("*ptr: %d\n", *ptr);

   

    return 0;

}

Output:


 

    *ptr: 10
    *ptr: 20
    *ptr: 100




2) Pointer to constant.
Pointer to constant can be declared in following two ways.

 

const int *ptr;

or

 

int const *ptr;

We can change the pointer to point to any other integer variable, but cannot change the value of the object (entity) pointed using pointer ptr. The pointer is stored in the read-write area (stack in the present case). The object pointed may be in the read-only or read-write area. Let us see the following examples.

 

#include <stdio.h> 

int main(void)

{

    int i = 10;   

    int j = 20;

    /* ptr is pointer to constant */

    const int *ptr = &i;    

   

    printf("ptr: %d\n", *ptr); 

    /* error: object pointed cannot be modified

    using the pointer ptr */    

    *ptr = 100;

   

    ptr = &j;          /* valid */ 

    printf("ptr: %d\n", *ptr);

   

    return 0;

}

Output:

 error: assignment of read-only location ‘*ptr’

Following is another example where variable i itself is constant.

 

#include <stdio.h> 

  

int main(void)

{  

    /* i is stored in read only area*/

    int const i = 10;    

    int j = 20;

  

    /* pointer to integer constant. Here i 

    is of type "const int", and &i is of 

    type "const int *".  And p is of type 

    "const int", types are matching no issue */ 

    int const *ptr = &i;        

  

    printf("ptr: %d\n", *ptr); 

  

    /* error */ 

    *ptr = 100;        

  

    /* valid. We call it up qualification. In 

    C/C++, the type of "int *" is allowed to up 

    qualify to the type "const int *". The type of 

    &j is "int *" and is implicitly up qualified by 

    the compiler to "const int *" */ 

  

    ptr = &j;          

    printf("ptr: %d\n", *ptr);

  

    return 0;

}

Output:

 error: assignment of read-only location ‘*ptr’

Down qualification is not allowed in C++ and may cause warnings in C. Following is another example with down qualification.

 

#include <stdio.h>

  

int main(void)

{

    int i = 10;

    int const j = 20;

  

    /* ptr is pointing an integer object */

    int *ptr = &i; 

  

    printf("*ptr: %d\n", *ptr); 

  

    /* The below assignment is invalid in C++, results in error 

       In C, the compiler *may* throw a warning, but casting is 

       implicitly allowed */

    ptr = &j;

  

    /* In C++, it is called 'down qualification'. The type of expression 

       &j is "const int *" and the type of ptr is "int *". The 

       assignment "ptr = &j" causes to implicitly remove const-ness 

       from the expression &j. C++ being more type restrictive, will not 

       allow implicit down qualification. However, C++ allows implicit 

       up qualification. The reason being, const qualified identifiers 

       are bound to be placed in read-only memory (but not always). If 

       C++ allows above kind of assignment (ptr = &j), we can use 'ptr' 

       to modify value of j which is in read-only memory. The 

       consequences are implementation dependent, the program may fail 

       at runtime. So strict type checking helps clean code. */

  

    printf("*ptr: %d\n", *ptr);

  

    return 0;

  

// Reference:

// http://www.dansaks.com/articles/1999-02%20const%20T%20vs%20T%20const.pdf

  

// More interesting stuff on C/C++ @ http://www.dansaks.com/articles.shtml



3) Constant pointer to variable.

 

int *const ptr;

Above declaration is a constant pointer to an integer variable, means we can change the value of object pointed by pointer, but cannot change the pointer to point another variable.

 

#include <stdio.h>

   

int main(void)

{

   int i = 10;

   int j = 20;

/* constant pointer to integer */

   int *const ptr = &i;    

   

   printf("ptr: %d\n", *ptr);

   

   *ptr = 100;    /* valid */

   printf("ptr: %d\n", *ptr);

   

   ptr = &j;        /* error */

   return 0;

}

Output:

 error: assignment of read-only variable ‘ptr’



4) constant pointer to constant

 

const int *const ptr;

Above declaration is a constant pointer to a constant variable which means we cannot change value pointed by the pointer as well as we cannot point the pointer to other variables. Let us see with an example.

 

#include <stdio.h>

   

int main(void)

{

    int i = 10;

    int j = 20;

/* constant pointer to constant integer */

    const int *const ptr = &i;        

   

    printf("ptr: %d\n", *ptr);

   

    ptr = &j;     /* error */

    *ptr = 100;   /* error */

   

    return 0;

}

Output:

     error: assignment of read-only variable ‘ptr’
     error: assignment of read-only location ‘*ptr’
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值