c和c++中const区别

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

猜你喜欢

转载自blog.csdn.net/guo3mao/article/details/78542160