C 语言的关键字 const详解
来源:互联网 发布:大乐网络 编辑:程序博客网 时间:2024/05/12 02:17
C 语言的关键字 const详解
1, 基本的const
1.1 const和变量的初始化
如果在定义const自动变量时没有进行初始化,
那么就没法直接进行初始化,而只能通过指针间接进行初始化。
int
main()
{
const int a;
a = 9;
//这里无法通过编译
//错误:向只读变量 ‘a’ 赋值
//但如果写成这样 const int a = 9;将顺利通过编译。
return 0;
}
1.2 以下定义是相同的
int const a = 9;
const int a = 9;
记住:const和基本自动变量使用,定义时可以交换位置。
在和指针一起定义某个变量时,不能交换。
1.3 const并非无法修改
无法直接修改const的变量,但可以通过指针的方式
间接修改。
void
test1(void)
{
int *pi;
int const a = 9;
printf("int const a = %d/n", a);
pi = &a;
*pi = 2;
printf("haha, I change it a = %d/n", a);
}
2, const 和指针
const和指针在一起使用时,容易搞混,
在网上找到一个识别的方法觉得用起来很不错:
舍弃法识破const。
1)首先舍弃const, 得到一个普通的声明;
2)若有多个const从最左边的const开始去。
3)然后舍弃const右面的const标志以及其它的关键字;
4)接下来就是将const右面所有的*和变量用一个新变量代替,
单个字符不用被取代,那么这个新变量就是const作用对象。
下面先给出这几个表达式的解释,后面用例子说明。
const int *A; //修饰指向的对象,A可变,A指向的对象不可变
int const *A; //修饰指向的对象,A可变,A指向的对象不可变
int *const A; //修饰指针A, A不可变,A指向的对象可变
const int *const A; //指针A和A指向的对象都不可变
2.1 const int *A;和 int const *A;
按照上面的3条,这两个的表达式的作用应该是一样的。
const的作用对象应该是*A这个整体。也就是作用于A指向的变量的值。
61 void
62 test4(void)
63 {
64 int num=12;
65 const int *A=#
66 (*A)++; //error: 令只读位置自增
67 printf("result=%d/n",*A);
68 }
61-68行可以看出,const int *A的确修饰的是*A这个整体,也就是
指针指向的值。
下面的这个例子说明了,虽然无法改变*A的值,但是可以改变A指针本身。
71 void
72 test5(void)
73 {
74 int a[] = {1,2,3,4,5};
75 const int *ar = &a;
76
77 *ar++; //ok
78 printf("result=%d/n",*ar); //result=2
79 }
2.2 int *const a; 和 const *int a;
const *int a; //这样的定义格式是错误的,指针不知道是什么类型。
int *const a;
按照上面的规则我可以判断,该const是修饰的a,而a被定义为一个指针。
所以他限定的对象是a这个指针。也就是说a的指针值不能修改。
#include<stdio.h>
int
main(void)
{
int a[] = {1,2,3,4,5};
int *const ar = a;
*ar++; //error
//若是这样写,就对了:
//*ar = 9; // ok
printf("result=%d/n",*ar); //result=2
return 0;
}
编译无法通过,出现错误:
test2.c: In function ‘main’:
test2.c:9: 错误:令只读变量 ‘ar’ 自增
2.3 const int *const a; //指针A和A指向的对象都不可变
通过分析知道,该定义中const限制了*a和a。也就是这
两个(作为整体)都不能改变。
1 #include<stdio.h>
2
3 int
4 main(void)
5 {
6 int a[] = {1,2,3,4,5};
7 const int *const ar = a;
8
9 //*ar++; //error
10 *ar = 9; // error
11 printf("result=%d/n",*ar); //result=2
12 return 0;
13 }
3, 作为参数时的const
17 void
18 testpc(const char *s, const int *a)
19 {
20 if (*a == 3) {
21 a = 0; //改变其地址允许
22 s[1] = "a"; //改变*s的值,出错
23 }
24 }
根据规则,这样的赋值是错误的,但如果改变其地址却可以。
const int *a;的意思是不能改变 *a这个整体的值。
- C 语言的关键字 const详解
- C语言的const关键字
- c语言的const关键字
- 详解C语言中const关键字的用法
- 详解C语言中const关键字的用法
- c语言中const关键字详解
- c语言中const关键字详解
- c语言中const关键字详解
- c语言中const关键字详解
- c语言中const关键字详解
- C语言中const关键字详解
- C语言关键字----Const
- C语言关键字----Const
- C语言----------const关键字
- C语言关键字const
- c语言const关键字
- c语言关键字const
- C语言关键字const
- 清空日志后原来要service syslog restart 的
- Java I/O (第二版) I/O基础 I/O概述
- c与c++ static函数的区别
- 如何获取AspXGridView模板中的RadioButtList控件的选中值
- 让iframe的高度height也可以设置百分比数值
- C 语言的关键字 const详解
- 共享卫士完全设置教程图解
- 事务的几种传播特性及隔离级别
- STL排序
- JAVASCRIPT常用技巧
- WORD文档出现乱码或丢失后的数据恢复问题
- MFC打印
- Flex之视窗状态 ------ 示例代码演示
- ajax文件上传应用