c中的const使用大全

来源:互联网 发布:网络女主播大闹机场 编辑:程序博客网 时间:2024/05/11 01:21

参考:百度百科

Case1 :

const int n=5;

int a[n];

不能这样使用,即使编译通过,对数组a大小的声明也是无效的。因为const修饰的是只读变量而ANSI C规定数组定义时长度必须是“常量在ANSI C中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量

Case 2:

例:下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢?
typedef char * pStr;
char string[4] = "bbc";
const char *p1 =" string"; //1式
const pStr p2 =" string"; //2式
p1++;
p2++;
答案与分析:
问题出在p2++上。

const使用的基本形式是:

形式1:const type m:其中m是限定不可变的,type是数据类型,可以使标准数据类型,也可以是自定义类型。此例中pStr是自定义的数据类型,因此p2是不可变的。

形式2:type const m;//只要牢记这两种基本形式,在含多个const的语句中,可以先把const 去掉分析。

例如:

const char * const p; //*p和p都不可变

//俩个都去掉:char *p;//定义的是字符型指针

//去掉一个:char *const p;//由形式2可知,p不可变

   const  char *p;//由形式1可知,*p不可变

Case 3

    int const * p1,p2;
    int d=9;
    p2=5;//错误,p2是const的
    p1=&d;//正确,p1不是const
    *p1=3;//错误,*p1是const
    printf("%d\n",*p1);
    *p1++;//*的优先级低于++;所以可以编译通过 但地址已经不是d的地址
    printf("%d\n",*p1);

p2是const;(*p1)是一整体,因此(*p1)是const,但p1是可变的。
同样去掉const分析,int * p1,p2只代表p1是指向整型的指针,要表示p1、p2都是指针是需写成int * p1,* p2。
    int * const p1,p2;
    int d=9;
    p2=5;//正确,p2不是const的
    p1=&d;//错误,p1是const
    *p1=3;//正确,*p1不是const

补充:

    int* const px;//这种定义是不允许的,即使在C中编译可以通过,但在C++编译不通过。(指针常量定义的时候需对其进行初始化)

   int const *px;这种定义是允许的。同样在c中可以编译通过,但在C++中编译不通过(常指针可以再定义的时候不初始化)

C++中需要对const常量定义时同时初始化。

总结:

使用const定义只读变量时关键要弄清楚哪些量是只读的不可变的,哪些量是可变的。

例如:

int const px;
px=9;//非法,px是只读的。因此在定义时最好完成初始化工作。

0 0
原创粉丝点击