const用法详解
const 只读(read only)
示例一:只读的int型变量
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型变量/int型变量的内存地址非只读
内存地址=指针
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型变量/只读的内存地址
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在谁后面谁就不可修改,const在最前面则将其后移一位即可,二者等效
const作用
(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常需要对它进行初始化,因为以后就没有机会再去改变它了;
(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数内部不能改变其值;
(4)对于类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;
======END======