const是用来声明一个常量的,当你不想让一个值被改变时就用const
C和C++ 中const的区别
1 int mian()
2 {
3 const int a = 10;
4 int arr[a] = {0};
5
6 int *p = (int*)&a;
7 *p = a;
8 printf("%d\n",a); //C中20;//cout<<a<<*p<<endl; 10,20
9 printf("%d\n",p);//20
10
11 cout<<*(&a)<<endl;
12}
区别 | C | C++ |
---|---|---|
1、被const修饰的变量 | 常变量 | 常亮(特殊情况也会变成常变量eg:const int a=c;) |
2、编译时 | 当做变量处理,读到时再从内存中取 | 直接替换成立即数()对于const变量,编译器会在编译之前做处理,在所有要读取该const变量的地方,把该const变量替换成他一开始就制定的常量) |
3、 | 不可做左值 | 不可做左值 |
4、 | 不可当常亮表达式,不可当数组下标 | 就是常量 |
5、 | centered | $12 |
2、eg:
int main(){
const int a=10;
const int * p=&a;
int * p_var=const_cast<int *>(p); //强制转换const指针为非const
*p_var=20; //往该指针所指向的内存写20,也就是把10给覆盖了
cout<<a<<endl;
cout<<(&a)<<endl;
cout<<*p<<endl;
cout<<(p)<<endl;
cout<<*p_var<<endl;
cout<<(p_var)<<endl;
return 0;
}
结果:
10 //a
0x28ac54 //&a
20 //*p
0x28ac54 //p
20 //*p_var
0x28ac54 //p_var
因为会在编译之前替换const变量
说到const,就不得不提到引用了,因为const在引用变量中也发挥了很大的用处:
引用
const变量影响函数重载
C语言中不允许重载
C++的才允许函数的重载
重载是由函数名和参数列表共同决定的(因为c++是用参数列表和函数名共同作为符号的)
参数列表相同与否,是由参数个数和参数类型决定的,
而const就是通过影响参数类型来影响函数重载的;
const int a 和
int const a 是没有区别的,都可以。
不涉及到指针const很好理解。
涉及到指针的情况:
int b=100;
const int * a=&b ; [1]
int const *a=&b; [2]
int* const a=&b; [3]
const int* const a =&b; [4]
如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。
因此:
[1]和[2]的情况相同,都是指针所指向的内容为常量,这种情况下不允许对内容进行更改操作,如不能*a = 3 ;
[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;
[4]为指针本身和指向的内容均为常量。
2、const int p和int const p的区别
const int *p
定义一个指针指向一个常量,不能通过指针来修改这个指针指向的值。
void main()
{
int i1=30;
int i2=40;
const int * pi=&i1;
printf("%d\n", *pi ) ; //30
pi=&i2; //注意这里,pi可以在任意时候重新赋值一个新内存地址
i2=80; //想想看:这里能用*pi=80;来代替吗?当然不能
printf("%d\n", *pi ) ; //80
system("pause");
}
3、字符数组和字符指针
char a[] = "I Love You!"; //定义了一个字符数组
char *p = "I Love You!"; //定义了一个字符指针
//可以将a理解为常量指针,而p为指向常量的指针
void main()
{
char a[] = "I Love You!"; //定义了一个字符数组,数组名a是一个常量指针,指向的位置不变,都是数组第一个元素的位置
char *p = "I Love You!"; //定义了一个字符指针,指针p指向一个字符串常量,这个字符串常量不能修改
//*(p+1)='a';//错误,不可以修改指针指向的值,所以这里注释掉。
a[1]='a';//常量指针,不能修改指针的值,但是可以修改指针所指向的值。
//a=p;//错误,a是常量指针,不可修改其值。
cout<<a<<endl;
cout<<p<<endl;
cout<<a[1]<<endl;
cout<<*(p+2)<<endl;
system("pause");
}
输出值为:
IaLove You!
I Love You!
a
L