广西住房城乡和建设厅网站,访问外国网站很慢,wordpress怎么用,最便宜做网站我们希望定义这样一种变量#xff0c;它的值不能被改变#xff0c;在整个作用域中都保持固定。例如#xff0c;用一个变量来表示班级的最大人数#xff0c;或者表示缓冲区的大小。为了满足这一要求#xff0c;可以使用const关键字对变量加以限定#xff1a;
const int M…我们希望定义这样一种变量它的值不能被改变在整个作用域中都保持固定。例如用一个变量来表示班级的最大人数或者表示缓冲区的大小。为了满足这一要求可以使用const关键字对变量加以限定
const int MaxNum 100; //班级的最大人数这样 MaxNum 的值就不能被修改了任何对 MaxNum 赋值的行为都将引发错误
MaxNum 90; //错误试图向 const 变量写入数据我们经常将 const 变量称为常量Constant。创建常量的格式通常为
const type name value;const 和 type 都是用来修饰变量的它们的位置可以互换也就是将 type 放在 const 前面
type const name value;建议将常量名的首字母大写以提醒程序员这是个常量。
由于常量一旦被创建后其值就不能再改变所以常量必须在定义的同时赋值初始化后面的任何赋值行为都将引发错误。一如既往初始化常量可以使用任意形式的表达式如下所示
#include stdio.hint getNum(){return 100;
}int main(){int n 90;const int MaxNum1 getNum(); //运行时初始化const int MaxNum2 n; //运行时初始化const int MaxNum3 80; //编译时初始化printf(%d, %d, %d\n, MaxNum1, MaxNum2, MaxNum3);return 0;
}运行结果
100, 90, 80 const 和指针
const 也可以和指针变量一起使用这样可以限制指针变量本身也可以限制指针指向的数据。const 和指针一起使用会有几种不同的顺序如下所示
const int *p1;
int const *p2;
int * const p3;在最后一种情况下指针是只读的也就是 p3 本身的值不能被修改在前面两种情况下指针所指向的数据是只读的也就是 p1、p2 本身的值可以修改指向不同的数据但它们指向的数据不能被修改。
当然指针本身和它指向的数据都有可能是只读的下面的两种写法能够做到这一点
const int * const p4;
int const * const p5;const 离变量名近就是用来修饰指针变量的离变量名远就是用来修饰指针指向的数据如果近的和远的都有那么就同时修饰指针变量以及它指向的数据。
const 和函数形参
在C语言中单独定义 const 变量没有明显的优势完全可以使用#define命令代替。const 通常用在函数形参中如果形参是一个指针为了防止在函数内部修改指针指向的数据就可以用 const 来限制。
在C语言标准库中有很多函数的形参都被 const 限制了下面是部分函数的原型
size_t strlen ( const char * str );
int strcmp ( const char * str1, const char * str2 );
char * strcat ( char * destination, const char * source );
char * strcpy ( char * destination, const char * source );
int system (const char* command);
int puts ( const char * str );
int printf ( const char * format, ... );我们自己在定义函数时也可以使用 const 对形参加以限制例如查找字符串中某个字符出现的次数
#include stdio.hsize_t strnchr(const char *str, char ch){int i, n 0, len strlen(str);for(i0; ilen; i){if(str[i] ch){n;}}return n;
}int main(){char *str http://www.baidu.com;char ch t;int n strnchr(str, ch);printf(%d\n, n);return 0;
}运行结果
2根据 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 类型的例子
#include stdio.hvoid func(char *str){ }int main(){const char *str1 www.baidu.com;char *str2 str1;func(str1);return 0;
}第7、8行代码分别通过赋值、传参传参的本质也是赋值将 const 类型的数据交给了非 const 类型的变量编译器不会容忍这种行为会给出警告甚至直接报错。