const
限定符 Const
CON-1 不能修改的变量
ANSI C中允许声明const
常量,它们的语法与变量几乎一样,但显著区别是const
常量一经初始化之后便不允许再次修改。
使用const
关键字修饰声明,使其成为一个const
常量:
const int a = 1;
int const a = 1;
以上两种声明的作用是相同的,声明了一个int
型的常量,它的值不能修改。a
不能在后续的代码中进行再次赋值,因此需要在声明时进行初始化。
CON-2 指针与const
当涉及到指针时,注意到这里同时存在两个对象:指针指向的变量和指针变量,而它们都可以被声明为const
常量。
首先,根据上面const
常量a
的声明,不难推测,指向const
常量的指针的声明可以是:
const int *pa = &a;
int const *pa = &a;
声明了pa
,作为一个指向const int
类型的指针,pa
的值是可变的(因为作为一个指针,可以通过赋值来使其指向另一个const int
类型的常量)。对pa
进行解引用,得到的是一个不允许修改的const
常量,因此不允许通过解引用此指针来修改a
。
有趣的是,指向const
常量的指针并没有规定必须指向一个const
常量。观察下面的例子中的常量指针:
#include <stdio.h>
int main(void){
int a = 5;
const int *pa = &a;
printf("a == %d\n",*pa);
a = 10;
//*pa = 20;错误!表达式必须是可修改的左值
printf("now,a == %d\n",*pa);
return 0;
}
输出为:
a == 5
now,a == 10
pa
是一个指向const int
型的指针,但它实际上指向一个普通的int
型变量。因此int
型变量可以通过其他的方式进行赋值,但不能通过解引用*pa
赋值。
因此,这样用一个指向const
常量的指针指向一个非const
常量的意义是:不希望通过解引用此指针的形式改变指向的变量。这个看似奇怪的用法在函数传参中往往非常实用。
- 在《C++ Primer》这本书中将这种情况形象的比喻为:指向
const
常量的指针其实是一种“自以为是”,它认为自己指向的是const
常量,所以很自觉地不去改变所指对象的值。
现在再回来看看作为const
常量的指针。
int a_int=1,b_int=2;
int * const p_const = &a_int;
//p_const = &b_int;错误!表达式必须是可修改的左值
printf("*p_const == %d\n",*p_const);
(*p_const)++;
printf("now,*p_const == %d",*p_const);
此时指针p_const
是一个常量,但它指向一个普通的int
变量。因此,p_const
的值是不可修改的,或者说不能再次使其指向其他的变量。*p_const
解引用得到普通的int
,可以用(*p_const)++;
修改。
最后,也可以将两者都声明为常量:
const int * const p = &a;
指针无法被修改,也无法通过解引用这个指针来修改指针指向的变量的值。
CON-3 函数与const
前面提到,const
可以确保一个变量不被修改,指向const
的指针可以确保指向的变量不会被此指针解引用修改。当你想要向函数传递一个指针,但又不希望这个函数意外地(一般是程序编写者的疏忽)修改了原先的变量,在形参列表中添加上const
是一种很不错的选择。
#include <stdio.h>
int *maxnum(const int* nums, int numsSize);
int main(void){
int nums[10] = {3,5,6,45,67,4,23,5,4,1};
int *p = maxnum(nums,10);
printf("max num in array nums[10] is %d\n",*p);
return 0;
}
int *maxnum(const int* nums, int numsSize) {
int max = 0;
const int *p = NULL;
for(int i=0;i<numsSize;i++){
if(nums[i]>max)
{
max = nums[i];
p = &nums[i];
}
}
//*p = 0;编译错误:p是const int *
//nums[1]=10;编译错误:nums是常量数组
return p;
}
在这个例子中,借助于const
的限制,成功预防了函数maxnum
意外修改主函数中nums
数组的元素。
注:这几天都被学校抓去社会实践了,没时间好好写笔记了X﹏X
本系列博客为我本人原创的学习笔记,尽量勤更新,如有错误欢迎各位大佬指出,Thanks♪(・ω・)ノ