深度剖析const

x33g5p2x  于2021-11-19 转载在 其他  
字(2.2k)|赞(0)|评价(0)|浏览(243)

1、用法

2、作用

1、const修饰变量

2、const修饰数组

3、const修饰指针

4、修饰函数的参数

5、const修饰函数的返回值

3、意义

1、用法

const放置的位置,可以放在变量之前,也可以放在变量之后。

const int a = 10 ;

int const a = 10 ;

上面这两种方法都是可以的。

不过我们更加建议第一种写法,因为这是我们正常的的书写习惯。

2、作用

1、const修饰变量

const修饰的变量,不可直接被修改。

直接修改就是下面这种例子,编译器肯定会报错!

#include<stdo.h>
int main()
{
    const int a = 0 ;
    a = 10 ;//这就是直接修改变量的值
    return 0 ;
}

下面是间接修改的方式(编译器不会报错且可以修改):

#include<stdio.h>
int main()
{
    const int a = 10; 
    int *p = &a;//当然,这个地方会出现警告,警告内容是左右两边类型不一致,因为右边是被const修饰的
    //这样修改即可消除警告:int *p = (int *)&a;(通过强制类型转换使左右两侧类型一致)
    *p = 20;
}

结论:const修饰的变量,并非真正意义上的不可修改的常量。

2、const修饰数组

同const修饰变量,格式有如下两种:

const int arr[]={1,2,3,4,5};

int const att[]={1,2,3,4,5};

上述两种方法效果是一样的。

通过上述两种方式来可以定义或者说明一个只读数组。

3、const修饰指针

#include<stdio.h>
int main()
{
    int a  =10;
   1. const int *p =&a;/*     p指向的变量不可以直接被修改,p指针变量所存储的地址值可以被修改(p
   的指向不可以被修改)---- 此处const修饰的是*,而不是int ,因为关键字是不能用来修饰关键字    */
    //*p = 20;(可以正常运行) p = 100;(不可以正常运行)

   2. int const *p = &a;//与第一种的作用完全相同,但还是推荐第一种

   3. int *const p=&a;/*      p指向的变量可以被修改,p指针变量所存储的地址值不可以被修改(p的指向不可以被修改)---此处const修饰的是p     */
   //*p= 20;(不可以正常运行) p = 100;(可以正常运行)

   4. const int *const p =&a;/*     p指向的变量不可以被修改,p指针所存储的地址不可以被修改(p的指向不可以被修改)---此处p和*都被修饰       */
   //*p = 20 ;(不可以正常运行) p = 100;(不可以正常运行)
    return 0;
}
int a = 10;
const int *p = &a;
int *q = p;
//上面这段代码会有警告,因为可以用*p修改变量a的值,如果想消除警告需要这样写:int *q = (int*)p;
int a = 10;
int *p = &a;
const int *q = p;
//这段代码不会有警告
//总结:一般我们把一个类型限制不是很严格的变量,赋给一个类型被严格限制的变量,编译器不会报错
//但如果我们把一个类型限制比较严格的变量,赋给一个类型限定不怎么严格的变量,便编译器一般会报错

4、修饰函数的参数

#include<stdio.h>
void show(const int *p)
{
    printf("value:%d\n",*p);
}
int main()
{
    int a = 10;
    int *p = &a;show(p);
    return 0;
}

在show()函数中,p=20;这段语句是无法正常运行的,因为在函数参数中用了const对进行了修饰,就是说当我们不希望某一个变量在函数中不可以被修改时就可以使用const来对某些变量进行修饰。

5、const修饰函数的返回值

#include<stdio.h>
const int*GetVal()
{
    static int a = 10;
    return &a;
}
int main()
{
    const int*p = GetVal();//这个地方必须加上前面的const来使左右的类型一致
    //*p = 100 ;程序会报错
}

const修饰函数的返回值表示不想通过指针的方式来修改函数的内部的变量。

一般内置类型返回,加const毫无意义。一般用const修饰的是指针。

3、意义

1、让编译器进行直接修改式检查,编译器在编译代码时,对于后续对const修饰的变量的相关语句进行语法检查,凡是后续对const修饰的变量进行直接修改的语句会进行报错。在某种程度上能够提前发现某些错误。

2、告诉其它程序员(正在改你代码或者正在阅读你代码的)这个变量不要对其进行修改,也属于一种自描述含义。

3、这是一段错误的代码:

#include<stdio.h>
int main()
{
    char *p = "hello";
    *p = 'H';
}

什么是真正的不可修改?

这段字符串并没有保存在栈帧中,而是保存在字符串常量区,此时的p变量是一个临时变量,指向这个字符串的起始地址,此时运行后会直接报错,这种情况下是真正意义上的不可被修改,是操作系统进行限制的,而不是C语言本身限制的。

const修饰变量是在编译期间保证我们的代码不可被修改,而不是在运行期间报错来让我们不可被修改的。

相关文章