Chinaunix首页 | 论坛 | 博客
  • 博客访问: 150432
  • 博文数量: 20
  • 博客积分: 1515
  • 博客等级: 上尉
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-14 10:06
文章分类

全部博文(20)

文章存档

2011年(2)

2010年(4)

2009年(14)

我的朋友

分类: C/C++

2009-05-14 10:24:21


1、const不是常量。
 
在一个符号前加上const限定符只是表示这个符号不能被赋值。也就是说它的值对这个符号来说是只读的。只是一个不能修改其值的变量.
  这里有两个知识点。

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

 2)能不能赋值;
 const int limit = 100;
 limi = 10000;//错误
 那么是不是用const限定的就绝对不能修改了呢?答案是NO
 const int * limitp = &limit;
 int i = 28;
 limitp = &i;
 这段代码表示limitp是一个指向常量整行的指针。这个指针不能用于修改这个整形数。但在任何时候。这个指针本身的值却是可以修改的。这样,它就指向了不同的地址,对它进行解除引用操作时会得到一个不同的值。
 
2、const和指针的混合应用。
 
 const int a[]={1,2,3,4,5};
 int b[]={1,2,3,4,5};
 const int * p1 = b;//第1种情况
 int * const p2 = b;//第2种情况
 const int * const p3 = b; //第3种情况
 
  第一种情况所表达的意思:p1是指向常量的指针,因此,不可以通过给指针赋值来改变数组中的数据,例如:
   *p1 = 10;       /*错误*/
   *(p1 + 2) = 1;  /*错误*/
   但这只表示*P1(也就是指针P1所指向的数组元素)是不可以改变的。那么P1本身的值是可以改变的。如:
   int c[] = {10,11,12,13,14};
   p1 = c;   //可以
  
   第二种情况完全不同了,他的意思是p2是不可修改的。但*p2(也就是指针P2所指向的数组元素)是可以修改的。例如:
     *p2 = 2;          /*可以*/
     *(p2+1) = 10;     /*可以*/
     p2++;             /*不可以*/
     p2 = c;     //不可以

    第三种情况,如果了解了前面两种情况。第三种就很容易理解了:p3 和 *p3都是不可以修改的;例如:
     *p3 = 2;          /*不可以*/
     p3++;             /*不可以*/
     p3 = c;     //不可以
    
   3、const 和*的组合通常用于数组形式的参数中传值调用
它的意思是“我给你一个指向它的指针,但你不能修改它”,是为了防止传递的函数参数不被修改,但是我们可以轻易的避开这个限制(当然并不是希望你这样做,只是讨论这种可能性)
#include
#include
void ChangeStr(const char *String);
int main(){
    char str[] = "The C programme";
    ChangeStr(str);
    printf(str);
}
void ChangeStr(const char *String)
{  
    char *Source = (char *)String;
    while (*Source)
    {
        *Source = toupper(*Source);
        Source++;
    }
}
上面的程序把字符串中的每个字符都转换成大写字母了。因为*String把地址给了*Source,而*Source的值的改变编译器并不干涉,可能有的编译器会发出警告之类。上面的程序只是为了说明const并不会阻止参数的修改,如果象上面程序那样,个人感觉没什么意义,只会让人容易混乱而已。

问题:
foo(const char **p){}
main(int argc,char ** argv){
 foo(argv);
}
为什么编译时会有警告(书上的解释感觉不是很清楚)
阅读(1209) | 评论(2) | 转发(0) |
0

上一篇:没有了

下一篇:容易引起错误的C语言特性

给主人留下些什么吧!~~

chinaunix网友2009-06-04 10:10:54

嗯。忽略了,多谢!

chinaunix网友2009-06-03 09:43:33

另外const修饰的变量必须进行初始化: const int i=5; //合法 const int j; //非法,导致编译错误