const用法详解
const 只读(read only)
int main(int argc,const char * argv[]){
const int a1;
int const a2;
// a1 = 2;
// a2 = 3;
printf("%d\n",a1);
printf("%d\n",a2);
}
上面这个例子,在声明int类型的变量a1和a2时,用const修饰符修饰,那就意味着变量a1和a2都是只读的int类型变量,同时被默认初始化,不能再次修改和赋值。
输出打印结果
0
0
Program ended with exit code: 0
内存地址=指针
int main(int argc,const char * argv[]){
int a=10;
int b=12;
int const *a1=&a;
const int *a2=&a;
int const *a3=NULL;
printf("%p\n",a1);
printf("%p\n",a2);
printf("%p\n",a3);
printf("%d\n",*a1);
printf("%d\n",*a2);
// printf("%d\n",*a3);
// *a1 = 11; //指针a1指向的int值read only
// *a2 = 12; //指针a2指向的int值read only
a1 = &b;
a2 = &b;
printf("%p\n",a1);
printf("%p\n",a2);
printf("%p\n",a3);
printf("%d\n",*a1);
printf("%d\n",*a2);
// printf("%d\n",*a3);
}
上面这个例子,声明int型的指针a1和a2,同时用const修饰,这里要弄懂const修饰的是谁,这里const修饰的都是int类型,所以指针指向的int类型的值不可修改和再次赋值,而指针(内存地址)a1和a2都是可以再次修改和赋值的。当修改了指针的值(内存地址)后,指针指向的值也会变化。
输出打印,
0x7fff5fbff7ac
0x7fff5fbff7ac
0x0
10
10
0x7fff5fbff7a8
0x7fff5fbff7a8
0x0
12
12
Program ended with exit code: 0
int main(int argc,const char * argv[]){
int a = 12;
int * const a1 = &a;
printf("%p\n",a1);
printf("%d\n",*a1);
int b = 14;
// a1 = &b; //内存地址a1 read only,不能再次被修改和赋值
*a1 = b;
printf("%p\n",a1);
printf("%d\n",*a1);
}
如上面这个例子,const修改的是int* ,也就是int指针,也就是内存地址是const的,而内存地址存储的值非const,也就是非read only。
输出打印,
0x7fff5fbff7ac
12
0x7fff5fbff7ac
14
Program ended with exit code: 0
int main(int argc,const char * argv[]){
int a = 12;
const int * const b = &a;
printf("%p\n",b);
printf("%d\n",*b);
int a1 = 13;
// b=&a1;
// *b=a1;
printf("%p\n",b);
printf("%d\n",*b);
}
如上面这个列子,还是要搞懂const修饰的是谁,在这里出现了两个const,前一个const修饰的是int,也就是说内存地址存储的值的是只读的。后一个const修饰的是*,也就是指针,也就是说内存地址是只读的。
输出打印如下,
0x7fff5fbff7ac
12
0x7fff5fbff7ac
12
Program ended with exit code: 0
const在谁后面谁就不可修改,const在最前面则将其后移一位即可,二者等效
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
======END======
原文:http://my.oschina.net/xinxingegeya/blog/513210