Linux C/C++——const

1.定义

  在C/C++中,const通常被用来声明一个变量为常量,用法:const int a = 100,但在C和C++中,const还是有些区别。

2.在C语言中

①C语言中const修饰的局部变量虽然我们不能直接修改,但我们可以通过地址来进行修改。

#include <stdio.h>
void
test01() { const int a = 100; //const修饰的局部变量是放在栈区的,不能直接被修改,但可以通过地址修改 int *p = &a; *p = 10; printf("%d ",a); } int main(int argc, char const *argv[]) { test01(); return 0; }

从上面的运行结果我们可以看到,在C语言中const修饰的局部变量虽然我们不能直接修改,但我们可以通过地址来进行修改。

②如果const修饰的是全局变量,那接无法修改了,会发生错误,无论是直接修改还是通过地址间接修改,都改不了。

#include<stdio.h>
const int b = 100;//const修饰的全局变量不能被修改
void test02()
{
    int *p = &b;
    *p = 10;
    printf("%d
",b);
}

int main(int argc, char const *argv[])
{
    test02();
    return 0;
}

但在C语言中,如果const修饰的是全局变量,那接无法修改了,会发生错误,无论是直接修改还是通过地址间接修改,都改不了。

③如果其他文件想要使用这个const修饰的变量,直接用extern修饰即可。

const_in_c.c主程序

#include<stdio.h>
extern const int num;
void test03()
{
    printf("%d
",num);
}

int main(int argc, char const *argv[])
{
    test03();
    return 0;
}

c_test.c这个程序的num变量,被主程序调用

const int num = 12;

再写一个Makefile,编译上面两个程序

const:const_in_c.o c_test.o
    gcc -o const const_in_c.o c_test.o
const_in_c.o:const_in_c.c
    gcc -c const_in_c.c
c_test.o:c_test.c
    gcc -c c_test.c

运行结果

如果其他文件想要使用这个const修饰的变量,直接用extern修饰即可。

3.在C++中

①在C++中,const修饰的局部变量放在符号表中,不管直接还是通过地址都是无法修改它的值的。

#include<iostream>
using namespace std;
void test01()
{
    const int a = 100;
    int *p = (int *)&a;
    *p = 10;
    printf("%d
",a);
}
int main(int argc, const char** argv) {
    test01();
    return 0;
}

运行结果我们可以看出,会报错,所以是无法修改的。

②const修饰的全局变量放在常量区,它的值无法被修改。

#include<iostream>
using namespace std;
const int  b = 100;
void test02()
{
    int *p = (int *)&b;
    *p = 10;
    printf("%d
",b);
}
int main(int argc, const char** argv) {
    test02();
    return 0;
}

也同样是发生错误,因为C++中const修饰的全局变量的值是无法被修改的。

③const修饰的变量默认是内部链接属性,用extern修饰可以将其改成外部链接属性。

 const_in_c++.cpp

#include <iostream>
using namespace std;
extern const int num;
void test03()
{
    printf("%d
",num);
}
int main(int argc, const char** argv) {
    test03();
    return 0;
}

c++test.cpp

extern const int num = 99;

运行结果

3.总结一下

在C语言中:

①const修饰的局部变量虽然我们不能直接修改,但我们可以通过地址来进行修改。

②const修饰的是全局变量,那接无法修改了,会发生错误,无论是直接修改还是通过地址间接修改,都改不了。

③如果其他文件想要使用这个const修饰的变量,直接用extern修饰即可。

在C++中:

①在C++中,const修饰的局部变量放在符号表中,不管直接还是通过地址都是无法修改它的值的。

②const修饰的全局变量放在常量区,它的值无法被修改。

③const修饰的变量默认是内部链接属性,用extern修饰可以将其改成外部链接属性。

原文地址:https://www.cnblogs.com/953-zjf/p/const.html