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);
}
为什么编译时会有警告(书上的解释感觉不是很清楚)
阅读(1232) | 评论(2) | 转发(0) |