您的位置:首页 > 其它

const用法详解

2011-11-03 16:45 316 查看
看 到const关键字,很多人想到的可能是const常量,其实关键字const并不能把变量变成常量!在一个符号前加上const限定符只是表示这个符号 不能被赋值。也就是它的值对于这个符号来说是只读的,但它并不能防止通过程序的内部(甚至是外部)的方法来修改这个值(C专家编程.p21)。也就是说
const变量是只读变量,既然是变量那么就可以取得其地址,然后修改其值。看来const也是防君子不防小人啊!:)

const 使用情况分类详析

1、const的普通用法

const int n = 10;

意思很明显,n是一个只读变量,程序不可以直接修改其值。这里还有一个问题需要注意,即如下使用:int
a
;在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而n只是一个变量。

2、const用于指针

const int *p;;//P可变,*P不可变

int const *p;;//P可变,*P不可变

int * const p;;//P不可变,*P可变

在最后的一种情况下,指针是只读的(即p只读),而在另外两种情况下一样,指针所指向的对象是只读的(即*p只读)。const 是一个左结合的类型修饰符,它与其左侧的类型修饰符一起为一个类型修饰符,所以,int
const 限定 *p,不限定p。int
*const 限定p,不限定*p。这里有一个简便的区分方法:

沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

3、const用于函数的地址传递参数

void foo(const int *p)

这种形式通常用于在数组形式的参数中模拟传值调用。也就是相当于函数调用者声称:"我给你一个指向它的指针,但你不能去修改它。"如果函数编写者遵循了这个约定,那么就相当于模拟了值传递。这也是const最有用之处了:用来限定函数的形参,这样该函数将不会修改实参指针所指的数据。这里注意了,是函数不应该去修改而不是不能修改,也就是说const不能阻止参数的修改

之所以把这作为一点来谈,就是因为有一些朋友可能会以为在函数参数中用了const就一定不可以改变

参数,这实际上是错误的理解,因为,它并不阻止参数的修改,下面举个简单的例子来阐述一下;

#include<stdio.h>

#include<ctype.h>

void ChangeStr(constchar
*String)

{ char*Source
= (char
*)String;

while (*Source){

*Source
= toupper(*Source);

Source++;

}

}

int
main(void){

charstr[]
= "The C programme";

Change(str);

printf(str);

system("Pause");

return0;

}

//end

上面的程序把字符串中的每个字符都转换成大写字母了。因为*String把地址给了*Source,而*Source的值的改变编译器并不干涉,可能有的编译器会发出警告之类。上面的程序只是为了说明const并不会阻止参数的修改,如果象上面程序那样,个人感觉没什么意义,只会让人容易混乱而已。

const用法:定义常量,修饰指针、函数的输入参数和返回值,简单说const表示只读的意思,本质上来说它只是在全局数据段或者栈中定义的是一个只读的常量,不是真正位于字符串常量区。Const的目的是为了产生高质量的代码,提高代码的可读性,同时保护好不能被任意改变的内存,从而降低Bug产 生的概率。

const int a = 10;

const int b;//错误,常量必须初始化

int a = 10,b = 9;

const int *p1 = &a;//指针指向的内容只读,不能通过该指针去写

*p1 = 11;//错误

int * const p2 = &a;//指针本身只读,指针初始化到一个对象后,将不能被修改

p2 = &b;//错误

const int*p3 const
= &a;//指针本身和指向的内容都是只读

const char *fp1(void) //修饰返回值,表示返回的指针指向内容只读

{

char *p = "dddd";

return p;

}

void fp1(const char *str)

{

*str = 4; //错误

const char *p = str;//p必须为const,才能接受str

}

int _tmain(int argc, _TCHAR* argv[])

{

const char *d = fp1();

printf("%s",d);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: