打印
[技术问答]

问一个C语言基础问题

[复制链接]
322|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wanduzi|  楼主 | 2019-11-30 20:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机的C语言里面。有个修饰词const,这个词放到变量类型前和后有什么区别吗?我看到有网友发的两个贴里有这两个用法,不太懂

使用特权

评论回复
沙发
zhuotuzi| | 2019-11-30 20:33 | 只看该作者
 在C语言程序中,const关键字也是经常会用到的一个关键字,那么使用const关键字的目的是什么呢?事实上,在程序中使用const关键字的主要目的就是为了向使用者传递设计者的一些意图。    事实上,无论我们是使用const关键字声明变量还是声明参数,其目的都是为了告诉使用者这个变量或者参数的应用目的。合理地使用关键字const 可以使编译器有效地保护那些不希望被改变的变量或参数,防止其无意中被代码修改。所以使用const关键字可以避免一些不必要的错误。    我们已经说明了const关键字的作用,接下来我们将更进一步讨论const关键字使用:  (1)const关键字修饰的变量     const关键字最常见的用法就是修饰变量,使用const关键字修饰的变量可以认为有只读属性。如:    const int a=10;    int b=0;    b=a;  (I)这条语句是正确的    a=b;  (II)这条语句是错误的,编译错误,因为a具有只读属性    虽然const关键字修饰的变量具有只读属性,但绝不能将它简单的等价于常量。事实上C语言的const关键字修饰的变量仅是语法上的常量。    此外,使用const关键字修饰的变量,在声明时必须进行初始化。这是显而易见的,既然是只读的,当然就得有一可供兑取的明确的值,而不是不确定的。例如:    const int a=10;    //合法用法    const int a;      //非法,导致编译错误    另外需要注意的是,使用const关键字定义的变量是全局性的。所以在使用的时候需要注意。    通常使用define定义一个宏,如:#define PI 3.1415976,以后无论在哪里需要使用圆周率时,我们直接使用PI即可,而在编译时预处理器会将所有的PI替换为3.1415976。这很方便,但是由于编译器不会对其进行检查,如果使用不慎就会引入错误,而且此种错误很难发现。而且,我们也无法得到PI的地址,不能向PI传递指针或引用。    为此,我们常使用const关键字修饰的变量来代替宏。使用const声明的变量虽然增加了分配空间,但是可以保证类型安全,并且可以得到其指针。const消除了预处理器的值替代的不良影响,并且提供了良好的类型检查形式和安全性,所以理解了const关键字,对我们的编程是有很大的帮助的。  (2)const关键字修饰的指针变量    const关键字除了用来修饰普通变量外,还经常用来修饰指针变量。当然,在讨论之前,我们需要搞清楚两个概念:常量指针和指向常量的指针。所谓常量指针就是指针变量的值一旦初始化就不能改变,所以必须初始化。而所谓指向常量的指针就是其指向的值是一个常量的指针。    在声明指针变量时,const关键字所处的位置,决定了其定义的指针变量的含义,例如我们定义:    (a)int * const p; 该语句表示指向整形的常量指针 ,它不能在指向别的变量,但指向(变量)的值可以修改。    (b)const int * p; 该语句表示指向整形常量 的指针,它指向的值不能修改。    (c)int const * p; 该语句与b的含义相同,表示指向整形常量 的指针,它指向的值不能修改。    (d)const int *const p; 该语句表示指向整形常量 的常量指针 。它既不能再指向别的常量,指向的值也不能修改。    (e)int const *const p; 该语句与d的含义相同,表示指向整形常量 的常量指针 。它既不能再指向别的常量,指向的值也不能修改。    这写定义容易让人糊涂,但有一点技巧可以帮助我们理解。就是看const关键字的右边跟着的是什么?当const关键字的右边是类型时,则表示值是常量;当const关键字的右边是指针变量,则表示指针本身是常量。  (3)const关键字修饰的函数形参    const关键字也经常用来修饰函数的形参。关键字const修饰函数形参时,通常用于参数为指针或引用的情况,且只能修饰输入参数。若输入参数采用“值传递”方式,由于函数将自动产生临时变量用于复制该参数,该参数本就不需要保护,所以不用const修饰。    const关键字修饰函数输入参数的形式如:void function(const  int * a ); 或者void function(const  int & a);都是可以的。在C标准库中就很多这样的应用,例如字符串处理函数:    字符串拷贝函数:char *strcpy(char *strDest,const char *strSrc);    返回字符串长度函数:int strlen(const char *str);    以上两个函数就是将源字符串使用const关键字保护起来,防止不注意的修改改变了源字符串的值。    佷显然,采用const关键字修饰函数形参,就是为了保护输入参数。在调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const int * a,则不能对传递进来的指针所指向的内容进行改变,保护了原指针所指向的内容;如形参为const int & a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。  (4)const关键字修饰的函数返回值    const关键字有时候也会用来修饰函数的返回值,这种情况一般是用来修饰返回的指针或引用,保护指针指向的内容或引用的内容不被修改。例如:    const char * function(void);    这种用法比较少见,在此仅提及一下。    综上所述,const关键字不但强大,而且对我们的编程确实有很大的帮助,前提是我们真正的理解了它的用法。

使用特权

评论回复
板凳
zhuotuzi| | 2019-11-30 20:33 | 只看该作者
https://www.cnblogs.com/foxclever/p/9826499.html

使用特权

评论回复
地板
zhuotuzi| | 2019-11-30 20:33 | 只看该作者
参考上一篇博客

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

129

主题

1657

帖子

3

粉丝