const用法 C语言

合集下载

const的五种用法

const的五种用法

const的五种用法包括:
1. const修饰变量,即常量。

这种常量在定义时,修饰符const可以用在类型说明符前,也可以用在类型说明符后。

2. const修饰指针,常用来限制指针所指向的内容不被修改。

有两种情况:const char * p或char const *p,p指向的内容(*p)不能修改;char* const p,表示p不能改变,但是p指向的内容(*p)可以改变。

3. const修饰函数,有三种情况:const修饰返回值(放在最前),表示返回的值不能修改;const修饰形参(中间位置),表示在函数体内,该形参不能修改;const修饰函数(放在最后),该形式只用于成员函数,表示函数内,成员变量不能修改。

4. const修饰对象,const对象只能调用const成员函数,不能调用普通函数。

非const对象,既可以调用普通成员函数,也可以调用const成员函数。

5. 用来声明常类型,常类型的变量或对象的值是不能被更新的。

定义或说明常类型时必须进行初始化。

以上就是const的五种用法,在使用时需要根据实际需求进行选择。

c语言中的const的作用及解析

c语言中的const的作用及解析

c语言中的const的作用及解析
在 C 语言中,const 关键字可以用来修饰变量、函数参数和函数返回值,其主要功能是限制变量或参数的修改权限,只允许读取。

const 修饰的数据类型是指常类型,常类型的变量或对象的值是不能被更新的。

const 的作用主要包括以下几个方面:
1. 定义 const 常量:const 定义的常量具有不可变性,可以在程序中保存常数,比如定义一个 const int 类型的常量,表示一个固定的整数。

2. 避免意义模糊的数字出现:在使用变量或参数时,如果变量或参数的名称与其所表示的含义不相关,会导致程序难以理解和维护。

const 关键字可以用来避免意义模糊的数字出现,比如在一个函数中定义一个 const int 类型的参数,表示该参数是一个常量,不能修改。

3. 提高程序的健壮性:const 关键字可以用来保护被修饰的东西,防止意外的修改,增强程序的健壮性。

比如在一个函数中定义一个 const int 类型的参数,如果在函数体内修改了该参数的值,会导致程序崩溃或产生不可预料的结果。

4. 节省空间:const 定义的常量在程序运行期间只有一份拷贝,不需要分配额外的内存空间,可以节省内存空间。

5. 提高程序的效率:const 关键字可以用来限制变量或参数的修改权限,可以避免不必要的内存分配和读写操作,从而提高程序的效率。

const 关键字在 C 语言中有着重要的作用,可以用来定义常量、保护变量或参数、提高程序的健壮性和效率等。

正确合理地使用 const 关键字可以提高程序的质量和维护性。

C语言的const使用方法

C语言的const使用方法

C语言的const使用方法C语言的const使用方法C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。

以下是店铺为大家搜索整理的C 语言的const使用方法,希望能给大家带来帮助!const是一个C语言的关键字,它限定一个变量不允许被改变。

使用const在一定程度上可以提高程序的安全性和可靠性。

const的使用是c语言中一个比较微妙的地方,请看下面几个问题。

问题:const变量和常量为什么下面的例子在使用一个const变量来初始化数组,ANSI C 的编译器会报告一个错误呢?const int n = 5;int a[n];答案与分析:1)这个问题讨论的是“常量”与“只读变量”的区别。

常量肯定是只读的,例如5,“abc”,等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。

而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。

C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。

上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。

而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的。

2) 注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是ANSI C对数组的规定限制了它。

3) 那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。

问题:const变量和 const 限定的内容下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢?typedef char * pStr;char string[4] = "abc";const char *p1 = string;const pStr p2 = string;p1++;p2++;答案与分析:问题出在p2++上。

c语言中const的含义和意思

c语言中const的含义和意思

c语言中const的含义和意思C语言中,const关键字用于指定程序中的常量。

其含义是该变量只能被初始化一次,且在初始化后不能被修改。

也就是说,const修饰的变量是只读的,不能再被改变。

const关键字可以修饰变量、函数、指针等。

下面将分别介绍它们的含义和用法:1. const修饰变量在C语言中,可以使用const关键字来定义常量。

例如:const int MAX_NUM = 100;这里将MAX_NUM定义为一个常量,它的值不能再被修改。

2. const修饰函数在C语言中,我们可以使用const关键字来修饰函数,指明该函数不会修改任何参数的值。

例如:int sum(const int* arr, int n){int s = 0;for(int i=0;i<n;i++){s += arr[i];}return s;}在上面的例子中,我们使用const修饰了函数的第一个参数(指针),这意味着函数不会修改指针所指的内容。

3. const修饰指针在C语言中,const还可以用来修饰指针。

例如:const int* p;这个例子中,p是一个指向int类型的指针,但是它指向的内容是只读的,不能被修改。

另一个例子:int* const p;在这个例子中,p是一个指向int类型的指针,但是它本身是不可变的,不能再指向其他的地址。

总之,在C语言中,使用const可以帮助我们在编写程序时更加安全地使用变量、函数和指针。

它可以防止数据被随意修改,保证程序的正确性。

c语言中const的用法

c语言中const的用法

c语言中const的用法c语言中const有着重要的作用,它可以用来确保变量值在执行过程中不被意外改变,避免程序出现混乱的状态。

在编程中,const 指令可以提供一种方式确保变量的值在执行过程中不会被改变。

以下是关于c语言中const的一些用法。

1.义常量const关键字可以用来定义常量,其中的值在程序执行过程中不会发生变化。

例如,定义一个PI常量,其值为3.14:const double PI = 3.14;这就表明PI的值不可以被修改,否则程序将会报错。

定义常量时,变量的声明类型和值要在定义时就确定,之后不能再改变。

2.明指针const关键字也可以用来声明指针,用来防止指针指向的内容被意外修改。

例如:int a = 10;const int* p = &a;这里声明的指针p是const的,它指向的内存空间在程序运行过程中不能被修改,否则程序会报错。

3.定函数参数c语言中const也可以用于在函数声明和定义中限定函数参数。

在函数定义时,可以使用const将参数变量声明为只读,因此它的值在函数中不能改变。

例如:void foo(const int a){a = 10; // error,编译会报错}4. const成员函数const有时也可以用于声明成员函数,表明其为只读操作,不能修改成员变量。

const成员函数不能修改类中数据成员和静态成员,但是可以调用非const成员函数。

例如:class Foo{public:void nonConstFunc();void constFunc() const;private:int m_value;};5. const_castconst_cast也是一种常用的表达式,它可以用于在不同类型之间转换,也可以用于去除const属性。

例如:int a = 10;const int* p = &a;int* p1 = p; // errorint* p2 = const_cast<int*>(p); //const int*转换成int* 以上就是围绕c语言中const的用法做的介绍,它可以用于定义常量、声明指针、限定函数参数和const成员函数等。

c语言 const的用法

c语言 const的用法

C语言中的const一直是C语言初学者心中的痛,这是因为const在不同位置有不同作用,在不同情景有不同角色。

这让初学者摸不清头脑。

今天,和大家一起研究一下const,让它的每个角色都“深入人心”!====================================================================== ========================情景一:最简单的const用法#include<stdio.h>int main(){int const a;a=5;printf("a=%d\n",a);return 0;}如果编译这个c文件,就会报错:1071.c: In function ‘main’:1071.c:5: error: assignment of read-only variable ‘a’显而易见,这是const在搞鬼,因为声明了const的变量是不能修改的!如果将源代码修改为如下这样,就没有问题了!#include<stdio.h>int main(){int const a=5;printf("a=%d\n",a);return 0;}总结:const声明的变量必须要进行初始化赋值,如果错过这个机会,以后再想给const的变量赋值,可就没门了!切记~PS:int const和const int是一回事,“颠倒写”都是可以的。

以后遇到了别犯晕,呵呵。

但是,还是要留个心眼,当const和指针搀和到一起时,这个“颠倒写”的规律可未必成立。

====================================================================== ========================情景二:发明const为了什么?在const诞生之前,开发者一直使用#define V AR 100来定义一些有特殊用途的类常量,不过这样定义是存在一些劣势的。

c语言const用法

c语言const用法

c语言const用法
const 关键字是C语言中一个重要的常量声明修饰符,它常常用于声明、定义
一个常量,它完全一静态类型,也就是说变量的值在声明定义之后不能改变。

1、const用来修饰基本的数据类型,如int、float等,这样声明的变量在运行
程序时不会改变。

例如:const int m=100;
2、对于指针也可以使用const关键字,当使用const修饰指针时,可以将指针
指向的内存地址保护起来,防止被意外改变,一般来说所指向的内存地址不允许修改,如果需要修改,需要使用带const修饰符的指针。

例如:int a=100;const int *p=&a;//p所指向的为a的地址,不可被改变
3、const也可以用来修饰类对象及函数,当const修饰类时,表示该类不能被
修改,因此它可以用于类的成员函数中,以保证类的派生类不会改变其它成员函数的行为。

例如:class A
{
public:
void foo(){}
void bar()const{}
private:
int m_data;
};
4、const也可以用来保护函数的参数,当参数加上const后,参数不能被修改,使用这种方法可以对参数传递的内容更加安全。

例如:void foo(const int a) //a值不会被改变
总之,const修饰符具有非常重要的作用,它可以在一定程度上提高C程序质量、增强语言功能,防止一些意外改变,应该积极地采用。

C语言中const关键字用法总结

C语言中const关键字用法总结

C++语言中con‎st关键字用‎法总结一、const是‎什么在C/C++ 语言中,const关‎键字是一种修‎饰符。

所谓“修饰符”,就是在编译器‎进行编译的过‎程中,给编译器一些‎“要求”或“提示”,但修饰符本身‎,并不产生任何‎实际代码。

就const 修饰符而言,它用来告诉编‎译器,被修饰的这些‎东西,具有“只读”的特点。

在编译的过程‎中,一旦我们的代‎码试图去改变‎这些东西,编译器就应该‎给出错误提示‎。

所以,const修‎饰符的作用主‎要是利用编译‎器帮助我们检‎查自己代码的‎正确性。

我们使用co‎n st在源码‎中标示出“不应该改变”的地方,然后利用编译‎器,帮助我们检查‎这些地方是否‎真的没有被改‎变过。

如果我们不小‎心去修改了这‎些地方,编译器就会报‎错,从而帮助我们‎纠正错误。

使用const和‎不使用con‎s t,对于最终编译‎产生的代码并‎没有影响。

虽然cons‎t对于最终代‎码没有影响,但是尽可能使‎用const‎,将帮助我们避‎免很多错误,提高程序正确‎率。

二、const可‎以修饰哪些对‎象在上面已经提‎到过了,const是‎一种修饰符,那它可以作为‎哪些对象的修‎饰符呢?下面列举了一‎些C/C++中用到con‎s t的地方。

1,const变‎量2,const指‎针3,const引‎用4,const类‎5,类的cons‎t成员变量6,类的cons‎t成员函数7,const修‎饰函数的形参‎与返回值下面我们分别‎讨论上面几种‎情况下,const的‎用法。

三、const与‎变量当一个变量被‎c onst修‎饰后,具有以下几个‎特点:1)该变量只能读‎取不能修改。

(编译器进行检‎查)2)定义时必须初‎始化。

3)C++中喜欢用co‎n st来定义‎常量,取代原来C风‎格的预编译指‎令defin‎e。

1 const int var; // Error:常量变量"var"需要初始化设‎定项2 const int var1 = 42;3 var1 = 43; // Error:表达式必须是‎可以修改的左‎值上面代码中第‎一行和第三行‎都有错误,注释便是编译‎器给出的错误‎提示。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

A const a;
定义常对象时,同样要进行初始化,并且该对象不能再被更新,修饰符 const 可以放
在类名后面,也可以放在类名前面。
(4)修饰常指针 3 l+ d6 _4 w. |; q
const int *A; //const 修饰指向的对象,A 可变,A 指向的对象不可变
int const *A; int *const A;
3 u" V& ^3 v+ X _, Y) i" F
class A & a9 I C( r$ h5 V
/ o4 F. v( N' {4 P
A f(const A& a); ......
1 H) k6 X( y: Y! K' ?, B% S
}; 如果采用抽象 const 进行解释,那就是 f 函数不会去改变所引用对象的抽象值,如果采用位 元 const 进行解释,那就成了 f 函数不会去改变所引用对象的任何位元。
定义或说明一个常数组可采用如下格式:
int const a[5]={1, 2, 3, 4, 5}; + \6 j$ s% p @- F6 @$ _3 n2 K# K
const int a[5]={1, 2, 3, 4, 5}; (3)修饰常对象
常对象是指对象常量,定义格式如下:
class A;
const A a;
' m3 E" ]9 R g& }) N/ r# {1 k
const MyClass Fun2(); (8)修饰类的成员函数: const 修饰符也可以修饰类的成员函数,格式如下:
4 A+ [9 x% g0 @! c. g+ ^
class ClassName ! g0 `5 g) b. q" d6 [2 c3 x
要:const int Max=you want;即可! # x b. V' W! |2 N! t
(4)可以保护被修饰的东西,防止意外的修改,增强程序的健壮性。 - E5 i- P2 O. l) G2 O8 ^& z+ A% z0 x
还是上面的例子,如果在函数体内修改了 i,编译器就会报错; , X% W' K+ _6 p' X9 I7 r
更新。其定义格式如下: . @7 S$ z; p2 b& f
const double & v;
(6)修饰函数的常参数 7 r. d2 d# K5 c6 Q
const 修饰符也可以修饰函数的传递参数,格式如下: 0 C1 B6 c( w5 A8 n, K* r: _
void Fun(const int Var);
(7) 提高了效率。 编译器通常不为普通 const 常量分配存储空间,而是将它们保存在符号表中,这使得它成为 一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
3、如何使用 const? 2 H( o8 q; s+ g o; w! I
(1)修饰一般常量 3 ]3 l5 X+ V' Y! h; \) @- S. d! D
( O+ ~. X! a. o& O) m
对于关键字 const 的解释有好几种方式,最常见的就是位元 const 和 抽象 const。下面我 们看一个例子: class A
2 o& m- ?% v2 l' P
{ - P6 L$ [& k6 b4 c k! \3 _" z
public: ......
double J=PI; //再进行宏替换,又一次分配内存! 5 s& D$ [0 n, y/ D
const 定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define 一样给 出的是立即数,所以,const 定义的常量在程序运行过程中只有一份拷贝,而#define 定义 的常量在内存中有若干个拷贝。
例如:
0 V% G) R) S% }+ M- G+ d* r; [
void f(const int i) { i=10;//error! }
(5) 为函数重载提供了一个参考。
class A
{
...... void f(int i) {......} //一个函数
1 z5 S6 q, ?/ {2 H0 b
" R' X [2 S! e/ |% l
另外,还要注意,常量必须初始化! 例如:
9 L8 G, M- L- `' I( u$ E5 i& _
const int i=5; . I8 z) ^' K2 h R5 O. ~2 T# O
4、几点值得讨论的地方: (1)const 究竟意味着什么? 说了这么多,你认为 const 意味着什么?一种修饰符?接口抽象?一种新类型?
) \5 h; _+ f r
...... 0 J. {0 b' L1 u! L; K8 k: A
double i=Pi; //此时为 Pi 分配内存,以后不再分配! double I=PI; //编译期间进行宏替换,分配内存
2 ?$ {8 I H5 a+ R3 ^
double j=Pi; //没有内存分配 # y# z$ w! `* R9 \
. j! V' I% @8 S L9 `9 r: t6 c6 d6 E
也许都是,在 Stroustup 最初引入这个关键字时,只是为对象放入 ROM 做出了一种可能, 对于 const 对象,C++既允许对其进行静态初始化,也允许对他进行动态初始化。理想的 const 对象应该在其构造函数完成之前都是可写的,在析够函数执行开始后也都是可写的,换句话 说,const 对象具有从构造函数完成到析够函数执行之前的不变性,如果违反了这条规则, 结果都是未定义的!虽然我们把 const 放入 ROM 中,但这并不能够保证 const 的任何形式 的堕落,我们后面会给出具体的办法。无论 const 对象被放入 ROM 中,还是通过存储保护 机制加以保护,都只能保证,对于用户而言这个对象没有改变。换句话说,废料收集器(我 们以后会详细讨论,这就一笔带过)或数据库系统对一个 const 的修改怎没有任何问题。 (2)位元 const V.S. 抽象 const?
告诉编译器 Var 在函数体中的无法改变,从而防止了使用者的一些无意的或错误的修改。 + c!
W1 o! g* U+ w- ^1 e
(7)修饰函数的返回值: 4 z, n: f- s3 k8 j" A
const 修饰符也可以修饰函数的返回值,是返回值不可被改变,格式如下: const int Fun1();
一般常量是指简单类型的常量。这种常量在定义时,修饰符 const 可以用在类型说明
符前,也可以用在类型说明符后。 1 A4 m/ ?8 B+ [
例如:
$ S+ c8 ] e7 H2 T- e
int const x=2; 或 const int x=2; : E- ] l" ~4 _! e
(2)修饰常数组 " v4 @, y: ]$ D( k7 c8 i5 z+ `
//const 修饰指向的对象,A 可变,A 指向的对象不可变 , Y6 g: {4 C0 H8 {' J& W) E7 K
//const 修饰指针 A, A 不可变,A 指向的对象可变
const int *const A; //指针 A 和 A 指向的对象都不可变
(5)修饰常引用
使用 const 修饰符也可以说明引用,被说明的引用为常引用,该引用所引用的对象不能被
{ public:
! ]! P5 e3 k2 \+ |
int Fun() const; ..... }; 这样,在调用函数 Fun 时就不能修改类里面的数据
(9)在另一连接文件中引用 const 常量 7 E; b: f+ t$ |% k+ M
extern const int i; //正确的引用 extern const int j=10; //错误!常量不可以被再次赋值
3 z0 X$ R4 F" F ~7 o; [4 ^
其次,使用位元 const 的库接口会暴露库的一些实现细节,而这往往会带来一些负面效应。 所以,在库接口和程序实现细节上,我们都应该采用抽象 const。 有时,我们可能希望对 const 做出一些其它的解释,那么,就要注意了,目前,大多数对 const 的解释都是类型不安全的,这里我们就不举例子了,你可以自己考虑一下,总之,我 们尽量避免对 const 的重新解释。
(3)放在类内部的常量有什么限制? 看看下面这个例子: class A {
9 q- {, H2 x3 X( H" p3 ~
private: const int c3 = 7; // ??? static int c4 = 7; // ???
' m p2 I9 D( P$ j$ D! a! i
static const float c5 = 7; // ??? ......
# d% W. o0 G2 x( a* _) i
我们可以看到位元解释正是 c++对 const 问题的定义,const 成员函数不被允许修改它所在 对象的任何一个数据成员。 为什么这样呢?因为使用位元 const 有 2 个好处: 最大的好处是可以很容易地检测到违反位元 const 规定的事件:编译器只用去寻找有没有对 数据成员的赋值就可以了。另外,如果我们采用了位元 const,那么,对于一些比较简单的 const 对象,我们就可以把它安全的放入 ROM 中,对于一些程序而言,这无疑是一个很重 要的优化方式。(关于优化处理,我们到时候专门进行讨论) 当然,位元 const 也有缺点,要不然,抽象 const 也就没有产生的必要了。 首先,位元 const 的抽象性比抽象 const 的级别更低!实际上,大家都知道,一个库接口的 抽象性级别越低,使用这个库就越困难。
相关文档
最新文档