当前位置:天才代写 > tutorial > C语言/C++ 教程 > C语言中正确利用const

C语言中正确利用const

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:508

副标题#e#

根基表明

const是一个C语言的要害字,它限定一个变量不答允被改变。利用const在必然水平上可以提高措施的结实性,别的,在寓目别人代码的时候,清晰领略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++上。


#p#副标题#e#

1)、const利用的根基形式: const char m;

限定m不行变。

2)、替换1式中的m, const char *pm;

限定*pm不行变,虽然pm是可变的,因此问题中p1++是对的。

3)、替换1式char, const newType m;

限定m不行变,问题中的charptr就是一种新范例,因此问题中p2不行变,p2++是错误的。

问题:const变量 & 字符串常量

请问下面的代码有什么问题?

char *p = "i’m hungry!";

p[0]= ‘I’; 

谜底与阐明:

上面的代码大概会造成内存的犯科写操纵。阐明如下, “i’m hungry”实质上是字符串常量,而常量往往被编译器放在只读的内存区,不行写。p初始指向这个只读的内存区,而p[0] = ‘I’则诡计去写这个处所,编译器虽然不会承诺。

问题:const变量 & 字符串常量2

请问char a[3] = "abc" 正当吗?利用它有什么隐患?

谜底与阐明:

在尺度C中这是正当的,可是它的保包涵况很是狭小;它界说一个巨细为3的数组,初始化为“abc”,,留意,它没有凡是的字符串终止符’\0’,因此这个数组只是看起来像C语言中的字符串,实质上却不是,因此所有对字符串举办处理惩罚的函数,好比strcpy、printf等,都不可以或许被利用在这个假字符串上。

#p#副标题#e#

问题5:const & 指针

范例声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面别离用const限定不行变的内容是什么?

1)、const在前面

const int nValue; //nValue是const

const char *pContent; //*pContent是const, pContent可变

const (char *) pContent;//pContent是const,*pContent可变

char* const pContent; //pContent是const,*pContent可变

const char* const pContent; //pContent和*pContent都是const

2)、const在后头,与上面的声明对等

int const nValue; // nValue是const

char const * pContent;// *pContent是const, pContent可变

(char *) const pContent;//pContent是const,*pContent可变

char* const pContent;// pContent是const,*pContent可变

char const* const pContent;// pContent和*pContent都是const

谜底与阐明:

const和指针一起利用是C语言中一个很常见的狐疑之处,在实际开拓中,出格是在看别人代码的时候,经常会因为这样而欠好判定作者的意图,下面讲一下我的判定原则:

沿着*号划一条线,const和谁在一边,那么谁就是const,即const限定的元素就是它。你可以按照这个法则来看上面声明的实际意义,相信定会一目了然。

别的,需要留意:对付const (char *) ; 因为char *是一个整体,相当于一个范例(如char),因此,这是限定指针是const。

 

    关键字:

天才代写-代写联系方式