舞钢网站建设,用网站模板建网站,wordpress个人主页,外贸外链网站有时候我们希望定义这样一种变量#xff0c;它的值不能被改变#xff0c;在整个作用域中都保持固定。例如#xff0c;用一个变量来表示班级的最大人数#xff0c;或者表示缓冲区的大小。为了满足这一要求#xff0c;可以使用const关键字对变量加以限定#xff1a;constin…有时候我们希望定义这样一种变量它的值不能被改变在整个作用域中都保持固定。例如用一个变量来表示班级的最大人数或者表示缓冲区的大小。为了满足这一要求可以使用const关键字对变量加以限定constint MaxNum 100;//班级的最大人数这样 MaxNum 的值就不能被修改了任何对 MaxNum 赋值的行为都将引发错误MaxNum 90;//错误试图向 const 变量写入数据我们经常将 const 变量称为常量Constant。创建常量的格式通常为const type name value;const 和 type 都是用来修饰变量的它们的位置可以互换也就是将 type 放在 const 前面type const name value;但我们通常采用第一种方式不采用第二种方式。另外建议将常量名的首字母大写以提醒程序员这是个常量。由于常量一旦被创建后其值就不能再改变所以常量必须在定义的同时赋值初始化后面的任何赋值行为都将引发错误。一如既往初始化常量可以使用任意形式的表达式如下所示#includestdio.hintgetNum(){
return100;
}intmain(){
int n 90;
constint MaxNum1 getNum();//运行时初始化
constint MaxNum2 n;//运行时初始化
constint MaxNum3 80;//编译时初始化
printf(%d, %d, %d\n, MaxNum1, MaxNum2, MaxNum3);return0;
}运行结果100, 90, 80const 和指针const 也可以和指针变量一起使用这样可以限制指针变量本身也可以限制指针指向的数据。const 和指针一起使用会有几种不同的顺序如下所示constint*p1;
intconst*p2;
int*const p3;在最后一种情况下指针是只读的也就是 p3 本身的值不能被修改在前面两种情况下指针所指向的数据是只读的也就是 p1、p2 本身的值可以修改指向不同的数据但它们指向的数据不能被修改。当然指针本身和它指向的数据都有可能是只读的下面的两种写法能够做到这一点constint*const p4;
intconst*const p5;const 和指针结合的写法多少有点让初学者摸不着头脑大家可以这样来记忆const 离变量名近就是用来修饰指针变量的离变量名远就是用来修饰指针指向的数据如果近的和远的都有那么就同时修饰指针变量以及它指向的数据。const 和函数形参在C语言中单独定义 const 变量没有明显的优势完全可以使用#define命令代替。const 通常用在函数形参中如果形参是一个指针为了防止在函数内部修改指针指向的数据就可以用 const 来限制。在C语言标准库中有很多函数的形参都被 const 限制了下面是部分函数的原型size_t strlen(constchar* str );
intstrcmp(constchar* str1,constchar* str2 );
char*strcat(char* destination,constchar* source );
char*strcpy(char* destination,constchar* source );
intsystem(constchar* command);
intputs(constchar* str );
intprintf(constchar* format,...);我们自己在定义函数时也可以使用 const 对形参加以限制例如查找字符串中某个字符出现的次数#includestdio.hsize_t strnchr(constchar*str,char ch){
int i, n 0, len strlen(str);for(i0; ilen; i){
if(str[i] ch){n;
}
}return n;
}intmain(){
char*str http://csdn.net;
char ch t;
int n strnchr(str, ch);
printf(%d\n, n);
return0;
}运行结果3根据 strnchr() 的功能可以推断函数内部要对字符串 str 进行遍历不应该有修改的动作用 const 加以限制不但可以防止由于程序员误操作引起的字符串修改还可以给用户一个提示函数不会修改你提供的字符串请你放心。const 和非 const 类型转换当一个指针变量 str1 被 const 限制时并且类似const char *str1这种形式说明指针指向的数据不能被修改如果将 str1 赋值给另外一个未被 const 修饰的指针变量 str2就有可能发生危险。因为通过 str1 不能修改数据而赋值后通过 str2 能够修改数据了意义发生了转变所以编译器不提倡这种行为会给出错误或警告。也就是说const char *和char *是不同的类型不能将const char *类型的数据赋值给char *类型的变量。但反过来是可以的编译器允许将char *类型的数据赋值给const char *类型的变量。这种限制很容易理解char *指向的数据有读取和写入权限而const char *指向的数据只有读取权限降低数据的权限不会带来任何问题但提升数据的权限就有可能发生危险。C语言标准库中很多函数的参数都被 const 限制了但我们在以前的编码过程中并没有注意这个问题经常将非 const 类型的数据传递给 const 类型的形参这样做从未引发任何副作用原因就是上面讲到的将非 const 类型转换为 const 类型是允许的。下面是一个将 const 类型赋值给非 const 类型的例子#includestdio.hvoidfunc(char*str){}intmain(){
constchar*str1 csdn.net;
char*str2 str1;
func(str1);
return0;
}第7、8行代码分别通过赋值、传参传参的本质也是赋值将 const 类型的数据交给了非 const 类型的变量编译器不会容忍这种行为会给出警告甚至直接报错。